我在基于 Spring Boot 的应用程序中使用ResponseEntityExceptionHandler
,在一个地方捕获错误并输出一致的错误有效负载。
一切都按预期工作。
ResponseEntityExceptionHandler
有一个方法handleHttpMessageNotReadable
,可用于在发送无效消息的客户端上“做出反应”(在我的情况下是一个JSON有效负载)。
同样,一切都按预期工作。如果客户端POST
是无效的JSON文档,则handleHttpMessageNotReadable
中的代码将正确执行。
现在,出于监控目的,我想记录无效的JSON。
这是我在handleHttpMessageNotReadable
方法中使用的代码,用于获取有效负载。
String line = null;
StringBuffer jb = new StringBuffer();
try {
BufferedReader reader = servletWebRequest.getRequest().getReader();
while ((line = reader.readLine()) != null)
jb.append(line);
} catch (IOException e) {
e.printStackTrace();
}
正如预期的那样,我得到一个例外,因为Jackson已经使用了流来实际解析JSON有效负载:
java.lang.IllegalStateException: getInputStream() has already been called for this request
访问原始POST有效负载的简单方法是什么?
是否可以抛出包含原始有效负载(MyException extends HttpMessageNotReadableException
)的自定义异常?
答案 0 :(得分:1)
请求正文从JSON转换为java类型 org.springframework.http.converter.json.MappingJackson2HttpMessageConverter
如果出现错误,则抛出HttpMessageNotReadableException 超类org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter #readJavaType
您可以继承MappingJackson2HttpMessageConverter,覆盖readJavaType(..)并尝试在那里抛出您自己的异常或自定义的HttpMessageNotReadableException。
您很可能需要clone the input stream,使用一个尝试反序列化JSON,另一个用于需要抛出异常的情况。 这可能会影响性能,但如果这不是问题,你可以尝试一下......