在我现有的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();
}
我想做的事情是读取请求中的正文,使用Jackson的
ObjectMapper
将其转换为POJO,然后将请求原样向前移动。不知道,这是什么原因422状态代码。 最佳答案
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