422状态码-ReaderInterceptor球衣

时间:2018-12-08 19:12:19

标签: java jersey interceptor

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

这是我的ReaderInterceptor的aroundReadForm()方法的代码

@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();
    }

我要做的是读取请求中的正文,使用杰克逊的ObjectMapper将其转换为POJO,然后将请求原样向前移动。不知道,这是什么原因422状态代码。

1 个答案:

答案 0 :(得分:1)

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