Метод GetReader уже вызван - при использовании пользовательской оболочки - PullRequest
0 голосов
/ 28 июня 2019

Я использую Spring boot, и я пытаюсь создать перехватчик, который будет регистрировать некоторую информацию о каждом запросе.Я прочитал, что мне нужно написать пользовательскую оболочку для класса HttpServlerRequest, чтобы получить доступ к телу запроса, потому что его вызов вызывается только один раз.Я создал класс wrap, но получаю исключение java.lang.IllegalStateException: getReader() has already been called for this request

Я думаю, что getReader вызывается один раз в моей оболочке, поэтому я не знаю, как это исключение выдается.Можете ли вы помочь мне?

Класс обертки:

    public class CustomWrapper extends HttpServletRequestWrapper {

    private static final Logger logger = LogManager.getLogger(CustomWrapper.class);
    @Getter
    private String body;


    public CustomWrapper(HttpServletRequest request) throws IOException {
        super(request);
        body = IOUtils.toString(request.getReader());
    }

    @Override
    public ServletInputStream getInputStream() {
        final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes());
        return new ServletInputStream() {
            @Override
            public boolean isFinished() {
                return byteArrayInputStream.available() == 0;
            }

            @Override
            public boolean isReady() {
                return true;
            }

            @Override
            public void setReadListener(ReadListener readListener) {

            }

            @Override
            public int read() {
                return byteArrayInputStream.read();
            }
        };
    }

    @Override
    public BufferedReader getReader() throws IOException {
        logger.info("WRAPPER - getReader");
        return new BufferedReader(new InputStreamReader(this.getInputStream(), Charset.forName("UTF-8")));
    }
}

Класс перехватчика:

@Component
public class CustomRequestInterceptor extends HandlerInterceptorAdapter {

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

        CustomWrapper wrapper = new CustomWrapper(request);
        return super.preHandle(request, response, handler);
    }
}

Так что в основном я создаю только экземпляр класса обертки и исключение в брошенном такЯ предполагаю, что реализация оболочки плохая, но я не могу ее найти.

...