我正在开发一个Spring MVC应用程序。我写了一个mvc:interceptor来打印传入请求的JSON内容。我尝试了两种方法,但两种方法都不起作用。
使用getReader()的第一种方式不起作用,因为getReader()只能被调用一次,而且它似乎已被容器调用,因此建议使用ServletInputStream接口。我有以下代码:
public class RequestInterceptor implements HandlerInterceptor {
private static final Logger logger = LoggerFactory.getLogger(RequestInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
logger.info("Received HTTP request with URL:" + request.getRequestURL());
ServletInputStream in = request.getInputStream();
byte[] buf = new byte[1000];
StringBuilder sb = new StringBuilder();
for (int nChunk = in.read(buf); nChunk!=-1; nChunk = in.read(buf))
{
sb.append(new String (buf, 0, nChunk));
}
logger.info("Request JSON Content" + sb.toString());
return true;
}
...
}
这种方法的问题是,在它通过拦截器并进入弹簧控制器后,它没有输入,可能是因为我的函数已经读取了输入。
我收到以下日志消息:
INFO : com.feelstream.server.interceptors.RequestInterceptor - Received HTTP request with URL:http://localhost:8090/server/FsServer/push_event
INFO : com.feelstream.server.interceptors.RequestInterceptor - Request JSON Content{
"evt_time":7,
"cell_id":7866,
"cell_lac":31,
"device_id":"62c7c7042511c086",
...
}
DEBUG: org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor - Reading [class com.feelstream.utils.Event] as "application/json" using [org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@4bec03a6]
DEBUG: org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver - Resolving exception from handler [public com.feelstream.utils.Response com.feelstream.server.controller.FsController.pushEvent(com.feelstream.utils.Event,org.springframework.validation.BindingResult)]: org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: No content to map due to end-of-input
at [Source: org.apache.catalina.connector.CoyoteInputStream@62818036; line: 1, column: 1]; nested exception is com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input
at [Source: org.apache.catalina.connector.CoyoteInputStream@62818036; line: 1, column: 1]
答案 0 :(得分:6)
以撒,
您应该可以像任何其他过滤器一样添加此过滤器
<filter>
<filter-name>commonsRequestLoggingFilter</filter-name>
<filter-class>org.springframework.web.filter.CommonsRequestLoggingFilter</filter-class>
<init-param>
<param-name>includePayload</param-name>
<param-value>true</param-value>
</init-param>
</filter>
在您的web.xml中
这将在Spring读取之前记录消息。如果您需要其他日志记录,则可以扩展此过滤器并添加更多功能。