Java HandlerInterceptorAdapter似乎没有转发HttpServletRequestWrapper
我正在尝试为我的JSON Web服务创建一个验证系统。其思想是让拦截器捕获每个Json@RequestBody,通过JacksonMapping使用它生成一个Json对象。然后从中读取ValidationAnnotations以检查数据,当传递完成常规流时,我们将使用包含错误消息的modelandviewmap发送回发送者Java HandlerInterceptorAdapter似乎没有转发HttpServletRequestWrapper,java,spring,servlets,spring-mvc,interceptor,Java,Spring,Servlets,Spring Mvc,Interceptor,我正在尝试为我的JSON Web服务创建一个验证系统。其思想是让拦截器捕获每个Json@RequestBody,通过JacksonMapping使用它生成一个Json对象。然后从中读取ValidationAnnotations以检查数据,当传递完成常规流时,我们将使用包含错误消息的modelandviewmap发送回发送者 知道这个上下文考虑这个 @RequestMapping(value="/rest/contact/list/filter", method = RequestMethod.P
知道这个上下文考虑这个
@RequestMapping(value="/rest/contact/list/filter", method = RequestMethod.POST, consumes="application/json", produces="application/json")
public @ResponseBody JsonContactList findFilteredContacts(@RequestBody JsonContactSelectorData selectorData, Model model) throws Exception {
MbaLog.debugLog(logger,"Finding Contacts with selector data: " + selectorData);
JsonContactList result = contactService.findContacts(selectorData);
return result;
}
这是我的控制器方法,拦截器将在前面,下面是拦截器
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
ValidationRequestWrapper wrapper = new ValidationRequestWrapper(request);
//do complex validation here
return super.preHandle(wrapper, response, handler);
}
列表上的下一个是requestwrapper
public class ValidationRequestWrapper extends HttpServletRequestWrapper {
private String jsonString;
public ValidationRequestWrapper(HttpServletRequest request) throws IOException {
super(request);
jsonString = "";
Scanner scanner = new Scanner(request.getInputStream(), "UTF-8").useDelimiter("\\A");
if (scanner.hasNext())
jsonString = scanner.next();
System.out.println("need a break");
}
@Override
public ServletInputStream getInputStream ()
throws IOException {
final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(jsonString.getBytes());
ServletInputStream inputStream = new ServletInputStream() {
public int read ()
throws IOException {
return byteArrayInputStream.read();
}
};
return inputStream;
}
}
如您所见,我获取请求输入流,然后覆盖getInputStream,这在这些情况下是自定义的。在拦截器中,您可以看到我实例化了这个包装器并将其传递给super.prehandle。。。。我希望随后进入控制器并愉快地进一步处理我的jsonobject。然而,结果相当令人失望
java.io.EOFException: No content to map to Object due to end of input
重写的inputstream方法似乎未被调用?还是我的机修工完全错了?我甚至可以使用HandlerInterceptorAdapter吗?我设法发现,使用HandlerInterceptorAdapter来实现我在问题中要求的功能是不可能的 解决这个问题的唯一方法是使用javax.servlet.Filter 范例
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
InterceptorRequestWrapper myRequestWrapper = new InterceptorRequestWrapper((HttpServletRequest) request);
String httpRequestMethod = ((HttpServletRequest) request).getMethod();
if("POST".equals(httpRequestMethod) || "PUT".equals(httpRequestMethod)){
String body = myRequestWrapper.getBody();
ErrorObject errorObject = new ErrorObject();
errorObject.setSource(body);
Map<String, List<ErrorMessage>> errorMessages = new HashMap<String, List<ErrorMessage>>();
ErrorMessage error = new ErrorMessage();
error.setErrorLabel("myerror");
errorMessages.put("test", Arrays.asList(error));
errorObject.setErrorMessages(errorMessages);
myRequestWrapper.setAttribute("errorObject", errorObject);
}
chain.doFilter(myRequestWrapper, response);
}
我设法弄明白,用HandlerInterceptorAdapter来实现我在问题中要求的功能是不可能的 解决这个问题的唯一方法是使用javax.servlet.Filter 范例
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
InterceptorRequestWrapper myRequestWrapper = new InterceptorRequestWrapper((HttpServletRequest) request);
String httpRequestMethod = ((HttpServletRequest) request).getMethod();
if("POST".equals(httpRequestMethod) || "PUT".equals(httpRequestMethod)){
String body = myRequestWrapper.getBody();
ErrorObject errorObject = new ErrorObject();
errorObject.setSource(body);
Map<String, List<ErrorMessage>> errorMessages = new HashMap<String, List<ErrorMessage>>();
ErrorMessage error = new ErrorMessage();
error.setErrorLabel("myerror");
errorMessages.put("test", Arrays.asList(error));
errorObject.setErrorMessages(errorMessages);
myRequestWrapper.setAttribute("errorObject", errorObject);
}
chain.doFilter(myRequestWrapper, response);
}