如何在 Spring 将其反序列化为 POJO 之前访问原始请求有效负载? [复制]
Posted
技术标签:
【中文标题】如何在 Spring 将其反序列化为 POJO 之前访问原始请求有效负载? [复制]【英文标题】:How to access the raw request payload before it is deserialized to a POJO by Spring? [duplicate] 【发布时间】:2019-11-27 03:15:15 【问题描述】:我想在它被反序列化为 POJO 之前访问原始有效负载(在我的情况下为 Json 主体)。
我的控制器有一个方法,其签名如下。
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;
【问题讨论】:
这有帮助吗? slackspace.de/articles/log-request-body-with-spring-boot 也可能是其中之一:***.com/q/33744875/2886891***.com/q/48301764/2886891***.com/q/7952154/2886891 【参考方案1】:你可以重写一个控制器类并重定向你截获的请求。 您还可以编写一个过滤器来拦截来自前端的请求,然后将其传递给 DispatcherServlet。 我无法提供代码,因为你没有放代码。
【讨论】:
以上是关于如何在 Spring 将其反序列化为 POJO 之前访问原始请求有效负载? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
Spring 尝试反序列化为 LinkedHashMap 而不是 POJO
RestController的配置将YAML反序列化为pojo上载为原始主体?
使用spring boot将JSON反序列化为带有通用对象列表的POJO
Spring Boot (Jackson):如何避免类名被序列化为 JSON