This question already has answers here:
Spring Boot - How to log all requests and responses with exceptions in single place?
(18个答案)
5个月前关闭。
我想访问原始有效负载(在我的情况下为Json主体),然后将其反序列化为POJO。
我的控制器有一个带有如下签名的方法。
现在,我只想访问初始有效负载,以便对其进行记录。
到目前为止,我已经尝试创建一个拦截器,在该拦截器中获取
接下来我尝试的是
那么,在反序列化原始有效负载之前,有什么方法可以记录它吗?实际上,我不想触摸控制器。在我看来,最好通过“拦截器”来做到这一点。谢谢,事先。
更新。感谢您指导我纠正资源。我使用了以下效果很好的解决方案。添加
(18个答案)
5个月前关闭。
我想访问原始有效负载(在我的情况下为Json主体),然后将其反序列化为POJO。
我的控制器有一个带有如下签名的方法。
public ResponseEntity doSomething(@RequestBody @Validated Dto dto, Errors erros)
现在,我只想访问初始有效负载,以便对其进行记录。
到目前为止,我已经尝试创建一个拦截器,在该拦截器中获取
HttpServletRequest
对象并获取Reader
或InputStream
并进行日志记录。完美的作品。但是问题是之后发生了什么。由于我已经访问过Reader
或InputStream
对象,因此它抛出IllegalStateException
说They have already been called
。接下来我尝试的是
ContentCachingRequestWrapper
。它解决了上面的问题,但是这次,当我调用端点时,它会生成没有响应主体的Bad Request
。我认为此解决方案中的ParameterMap
有问题。还指出了here。另外,那里的解决方案对我不起作用,字节数组似乎为空。那么,在反序列化原始有效负载之前,有什么方法可以记录它吗?实际上,我不想触摸控制器。在我看来,最好通过“拦截器”来做到这一点。谢谢,事先。
更新。感谢您指导我纠正资源。我使用了以下效果很好的解决方案。添加
CommonsRequestLoggingFilter
起作用。但是请注意,应启用logging.level.org.springframework.web.filter.CommonsRequestLoggingFilter=DEBUG
。@Bean
public CommonsRequestLoggingFilter requestLoggingFilter() {
CommonsRequestLoggingFilter loggingFilter = new CommonsRequestLoggingFilter();
loggingFilter.setIncludeClientInfo(true);
loggingFilter.setIncludeQueryString(true);
loggingFilter.setIncludePayload(true);
return loggingFilter;
}
最佳答案
您可以重写控制器类并重定向已拦截的请求。
您还可以编写一个过滤器来拦截前端的请求,然后将其传递给DispatcherServlet。
我无法提供代码,因为您还没有安装代码。
10-08 00:52