2014-01-21 3 views
1

Мне любопытно, есть ли в JAX-RS функция аннотации/фильтра/перехватчика, чтобы определить, содержит ли пул или метод POST пустой объект.Подтвердите пустое тело запроса метода PUT, POST в JAX-RS

В настоящее время у меня есть метод, который, если запрос имеет пустое тело, возможно, бросает NPE.

@PUT 
@Produces("application/json") 
@Consumes("application/json") 
@Path("/update/{id}") 
public Response updateCustomer(@PathParam("id") final String customerIdStr, final CustomerJson customer) { 
    // if request body is empty -> customer == null 
    return Response.ok().build(); 
} 

я могу проверить customer для нуля. Но поскольку у меня много таких методов, лучше иметь фильтр для такой проверки.

Пожалуйста, примите во внимание!

ответ

1

Вы пытались использовать проверку Bean, используя аннотацию @NotNull на вашем параметре метода CustomerJson?

+0

Да. Он возвращает короткую строку stacktrace без возможности объявить для нее ExceptionMapper. – ZuzEL

+0

Mmmh, почему вы не можете зарегистрировать ExceptionMapper для него? Какой класс Exception у вас есть? –

+0

Ну, это NPE. Я не хочу ловить NPE. Соль состоит в том, чтобы предсказать этот NPE из пустого тела и убедиться, что он зафиксирован перед временем выполнения. Другие NPE должны быть в состоянии обнаружить их. – ZuzEL

1

Перехватчики читают тело HTTP, и я не нахожу способ отправить тело для дальнейшей обработки. Но вы можете сделать это с помощью сервлет-фильтра и обертки запроса сервлетов HTTP,

public class EmptyCheckFilter implements javax.servlet.Filter { 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, 
     FilterChain chain) throws IOException, ServletException { 

    HttpServletRequest req = (HttpServletRequest) request; 
    HttpServletResponse res = (HttpServletResponse) response; 

    if (req.getMethod().equals("POST") || req.getMethod().equals("PUT")) { 
     boolean dirty = false; 
     HttpRequestWrapper wrapper = new MyHTTPRequestWrapper(req); 
     try { 
    // check body is empty by wrapper.getBody() and set dirty = true; 
     } catch (Exception e) { 
     } 
     if (dirty) { 
     res.sendError(400, "Invalid input"); 
     } else 
     chain.doFilter(wrapper, response); 
    } else 
     chain.doFilter(request, response); 
    } 

    @Override 
    public void destroy() { 
    } 

    @Override 
    public void init(FilterConfig arg0) throws ServletException { 
    } 
} 

public class MyHTTPRequestWrapper extends HttpServletRequestWrapper { 

    private final String body; 

    public MyHTTPRequestWrapper(HttpServletRequest request) throws IOException { 
    super(request); 
    StringBuilder stringBuilder = new StringBuilder(); 
    BufferedReader bufferedReader = null; 
    try { 
     InputStream inputStream = request.getInputStream(); 
     if (inputStream != null) { 
     if (request.getCharacterEncoding() != null) 
     bufferedReader = new BufferedReader(new InputStreamReader(inputStream, request.getCharacterEncoding())); 
     else 
      bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); 
     char[] charBuffer = new char[128]; 
     int bytesRead = -1; 
     while ((bytesRead = bufferedReader.read(charBuffer)) > 0) { 
      stringBuilder.append(charBuffer, 0, bytesRead); 
     } 
     } else { 
     stringBuilder.append(""); 
     } 
    } catch (IOException ex) { 
     throw ex; 
    } finally { 
     if (bufferedReader != null) { 
     try { 
      bufferedReader.close(); 
     } catch (IOException ex) { 
      throw ex; 
     } 
     } 
    } 
    body = stringBuilder.toString(); 
    } 

    @Override 
    public ServletInputStream getInputStream() throws IOException { 
    final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(
     body.getBytes()); 
    ServletInputStream servletInputStream = new ServletInputStream() { 
     public int read() throws IOException { 
     return byteArrayInputStream.read(); 
     } 
    }; 
    return servletInputStream; 
    } 

    @Override 
    public BufferedReader getReader() throws IOException { 
    return new BufferedReader(new InputStreamReader(this.getInputStream())); 
    } 

    public String getBody() { 
    return this.body; 
    } 
} 
Смежные вопросы