我在弹簧引导中使用拦截器,但在那里我收到错误



我必须在 springboot 中使用拦截器在请求继续之前和之后进行一些处理。但是在使用它时,我遇到了一个错误:到目前为止,我只是尝试使用预处理方法,在那里我遇到了这个问题。

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 转换可能存在一些问题,所以我尝试了其他解决方案,例如杰克逊库,我也面临着同样的问题。

在这里,我必须将HttpServletRequest转换为jsonObject,但是我遇到了上述错误。当我删除以下逻辑将 BufferedReader 转换为 jsonObject 并仅从预处理方法返回 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。

当你从HttpServletRequest读取一个身体时,这个身体被消耗掉了,所以当它到达controller时,你可能已经提到@RequestBody,将没有数据可以接收。这就是您收到Status Code : 400 Required request body is missing的原因.

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

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

相关内容

最新更新