422 状态码 - ReaderInterceptor Jersey
422 status code - ReaderInterceptor Jersey
在我现有的 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 字符串解析为 object 两次。一次进入拦截器,一次进入 reader.
如果 body 很小,这不是什么大问题。
在我现有的 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 字符串解析为 object 两次。一次进入拦截器,一次进入 reader.
如果 body 很小,这不是什么大问题。