This question already has answers here:
Spring Boot - How to log all requests and responses with exceptions in single place?
                                
                                    (18个答案)
                                
                        
                                5个月前关闭。
            
                    
我想访问原始有效负载(在我的情况下为Json主体),然后将其反序列化为POJO。

我的控制器有一个带有如下签名的方法。

public ResponseEntity doSomething(@RequestBody @Validated Dto dto, Errors erros)


现在,我只想访问初始有效负载,以便对其进行记录。

到目前为止,我已经尝试创建一个拦截器,在该拦截器中获取HttpServletRequest对象并获取ReaderInputStream并进行日志记录。完美的作品。但是问题是之后发生了什么。由于我已经访问过ReaderInputStream对象,因此它抛出IllegalStateExceptionThey 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