<分区>
我想在反序列化为 POJO 之前访问原始负载(在我的例子中是 Json 主体)。
我的 Controller 有一个带有如下签名的方法。
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 .此外,那里的解决方案对我不起作用,字节数组似乎是空的。
那么有没有办法在反序列化之前记录原始有效负载?实际上,我不想碰 Controller 。在我看来,最好通过拦截器来做到这一点。预先谢谢。
更新。感谢您指导我更正资源。我使用了以下完美运行的解决方案。添加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;
}