如何在 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 对象并获取 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;

【问题讨论】:

这有帮助吗? 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

如何使用 System.Text.Json API 将流反序列化为对象

将json反序列化为键值对列表[重复]