首页 > 解决方案 > 422 状态码 - ReaderInterceptor Jersey

问题描述

在我现有的 API 调用之一中引入ReaderInterceptor后,我收到 422 错误。电话之前工作正常,但在我介绍了 ReaderInterceptor 后开始给出 422。

这是我的 ReaderInterceptoraroundReadForm()方法的代码

@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 状态码的原因是什么。

标签: javajerseyinterceptor

解决方案


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


推荐阅读