java - 如何在 Spring 将其反序列化为 POJO 之前访问原始请求负载?

标签 java json spring spring-boot interceptor

<分区>

我想在反序列化为 POJO 之前访问原始负载(在我的例子中是 Json 主体)。

我的 Controller 有一个带有如下签名的方法。

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

现在,我只想访问初始负载,以便记录它。

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

最佳答案

您可以重写一个 Controller 类并重定向您拦截的请求。 你也可以写一个过滤器来拦截来自前端的请求,然后将它传递给 DispatcherServlet。 我无法提供代码,因为您还没有打开代码。

关于java - 如何在 Spring 将其反序列化为 POJO 之前访问原始请求负载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57090217/

相关文章:

java - 防止 ehcache 在启动时尝试访问互联网

java - 什么以及为什么是 Java 6 和 Java 7?

php - 将 mysql 加载到 NVD3 的 json

javascript - 如何使用对象的 for 循环来循环 Restfulwebservice

java - 自定义 Spring UserDetailsS​​ervice 未调用

java - 我可以 Autowiring 命名记录器吗?

java - 如何在java中跳过txt文件中的行

java - 当我使用正则表达式有数据时,如何将数据从字符串转换为整数

java - 我有坐标列表,我的要求是安排它

php - 通过 php 页面中的 url 从 javascript 发送数组但是