Я использую Interceptor в Springboot, но там я получаю сообщение об ошибке - PullRequest
1 голос
/ 08 июня 2019

Мне нужно использовать перехватчик в 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 из метода prehandle, он работал правильно.

Код:

@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 во время тестирования вышеуказанного звонка от почтальона.

1 Ответ

0 голосов
/ 08 июня 2019

Когда вы читаете тело из HttpServletRequest, тело потребляется, поэтому, когда оно достигает controller, где вы могли упомянуть @RequestBody, данные не будут получены.Вот почему вы получаете Status Code : 400 Required request body is missing.

В более простых терминах тело в запросе может быть прочитано только один раз.

Но если вы хотите обработать до бизнес-логики, вы должны кешировать это вперехватчик для его использования (может быть, используя ThreadLocal) или посмотрите RequestBodyAdviceAdapter

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...