打印HttpServletRequest JSON内容

时间:2014-06-22 05:59:35

标签: java json spring spring-mvc

我正在开发一个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]

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读取之前记录消息。如果您需要其他日志记录,则可以扩展此过滤器并添加更多功能。