【问题标题】:I am using the Interceptor in springboot , but there I am getting the error as我在 springboot 中使用 Interceptor ,但出现错误
【发布时间】:2019-10-23 16:42:30
【问题描述】:

我必须使用 springboot 中的拦截器在请求进行之前和之后进行一些处理。但是在使用它时,我遇到了一个错误:到目前为止,我只是尝试使用 to pre-handle 方法,并且我遇到了这个问题。

org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing"
at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:160)
    at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:130)
    at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:124)
    at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:161)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:131)

我认为 Json 转换可能存在一些问题,所以我尝试了其他解决方案,例如 Jackson 库,我也面临同样的问题。

在这里,我必须将 HttpServletRequest 转换为 jsonObject,但我收到了上述错误。当我删除 BufferedReader 到 jsonObject 转换的以下逻辑并从 prehandle 方法返回 true 时,它​​可以正常工作。

代码:

@Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {

        StringBuffer jb = new StringBuffer();
        String line = null;
        try {
            BufferedReader reader = request.getReader();
            while ((line = reader.readLine()) != null)
                jb.append(line);

            JSONObject obj = new JSONObject(jb.toString());
            System.out.println(obj);
        } catch (Exception e) {
        }

        return super.preHandle(request, response, handler);
    }

在测试邮递员的上述电话时​​,我得到了 400。

【问题讨论】:

  • 大家好,我尝试使用 Wrapper 和缓存概念来解决这个问题。但仍然没有解决。请建议我该怎么做

标签: java spring spring-boot


【解决方案1】:

当您从 HttpServletRequest 读取正文时,该正文被消耗,因此当它到达您可能提到的 controller 时,将不会收到任何数据 @RequestBody 。这就是您收到Status Code : 400 Required request body is missing 的原因。

简单来说,请求中的正文只能读取一次。

但是如果你想在业务逻辑之前处理你必须将它缓存在拦截器中以便使用它(可能正在使用 ThreadLocal)或查看RequestBodyAdviceAdapter

【讨论】:

  • 我对spring-boot还很陌生,能否请您建议如何在拦截器中实现缓存。我搜索了很多,但找不到任何具体的 springboot 解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-19
  • 2019-11-26
  • 2022-11-13
  • 2019-02-04
  • 2017-12-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多