422 код состояния - ReaderInterceptor Джерси - PullRequest
0 голосов
/ 08 декабря 2018

Я получаю ошибку 422 после ввода ReaderInterceptor в один из моих существующих вызовов API.Вызов работал нормально раньше, но начал давать 422 после того, как я представил ReaderInterceptor.

Вот код для метода aroundReadForm() моего ReaderInterceptor

@Override
    public Object aroundReadFrom(ReaderInterceptorContext context) throws IOException, WebApplicationException {
        InputStream is = context.getInputStream();
        String body = new BufferedReader(new InputStreamReader(is)).lines().collect(Collectors.joining("\n"));
        ObjectMapper mapper = new ObjectMapper();
        try {
            SampleObject sampleObject = mapper.readValue(body, SampleObject.class);
            LOGGER.info(sampleObject.getSampleProperty());

        } catch (JsonGenerationException | JsonMappingException e) {
            LOGGER.info(e.getMessage());
        }
        return context.proceed();
    }

Я пытаюсь прочитать тело в запросе, преобразовать его в POJO, используя Джексона ObjectMapper и затем переместите запрос вперед как есть.Не уверен, что является причиной этого 422 кода состояния.

1 Ответ

0 голосов
/ 09 декабря 2018

ObjectMapper закроет поток ввода запроса.Попробуйте создать новый поток из переменной body.И вызов context.setInputStream ().

public Object aroundReadFrom(ReaderInterceptorContext context) throws IOException, WebApplicationException {
        InputStream is = context.getInputStream();
        String body = new BufferedReader(new InputStreamReader(is)).lines().collect(Collectors.joining("\n"));
        ObjectMapper mapper = new ObjectMapper();
        try {
            SampleObject sampleObject = mapper.readValue(body, SampleObject.class);
            LOGGER.info(sampleObject.getSampleProperty());

        } catch (JsonGenerationException | JsonMappingException e) {
            LOGGER.info(e.getMessage());
        }
        InputStream in = new ByteArrayInputStream(body.getBytes(StandardCharsets.UTF_8));

        context.setInputStream(in)
        return context.proceed();
    }

Недостатком того, что вы пытаетесь сделать, является производительность.Кажется, вы проанализируете строку JSON для объекта дважды.Один раз в перехватчике и один раз в считывателе.

Если тело маленькое, это не большая проблема.

Ресурс: https://www.baeldung.com/jersey-filters-interceptors

...