我们通过 Spring MVC 公开了 REST 服务。我们使用 aHandlerExceptionResolver
来记录异常。我们目前记录以下内容:
- 异常及其堆栈跟踪
- 网址
- 请求标头
如果我们也可以记录 JSON 发布数据,那么调试会更容易。关于如何获得这个的任何建议?
将此添加到代表应用程序配置的类中:
import javax.servlet.Filter;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.filter.AbstractRequestLoggingFilter;
……
@Bean
public Filter loggingFilter(){
AbstractRequestLoggingFilter f = new AbstractRequestLoggingFilter() {
@Override
protected void beforeRequest(HttpServletRequest request, String message) {
System.out.println("beforeRequest: " +message);
}
@Override
protected void afterRequest(HttpServletRequest request, String message) {
System.out.println("afterRequest: " +message);
}
};
f.setIncludeClientInfo(true);
f.setIncludePayload(true);
f.setIncludeQueryString(true);
f.setBeforeMessagePrefix("BEFORE REQUEST [");
f.setAfterMessagePrefix("AFTER REQUEST [");
f.setAfterMessageSuffix("]\n");
return f;
}
你可能需要注释掉
f.setIncludePayload(true);
您需要一个过滤器来在读取请求正文时保存它,并稍后将保存的数据提供给您的异常记录器。
Spring包含AbstractRequestLoggingFilter
做类似的事情。虽然它并不直接适合您的问题,但您可以将其用作实现您自己的过滤器的参考。
没有简单的方法来记录请求/响应的负载。您可以使用 java web 过滤器来拦截所有请求和响应,并从流中读取 JSON 数据。但是有一个问题,当您从流中读取数据时,实际数据将从流中耗尽。
因此,您必须实现实际请求和响应对象的包装器。只会记录请求响应的复制版本。我们已经实现了类似的解决方案,如下所示,它满足了我们的要求:
http://www.wetfeetblog.com/servlet-filer-to-log-request-and-response-details-and-payload/431
http://angelborroy.wordpress.com/2009/03/04/dump-request-and-response-using-javaxservletfilter/