【问题标题】:Spring ResponseEntityExceptionHandler and original POST payloadSpring ResponseEntityExceptionHandler 和原始 POST 有效负载
【发布时间】:2017-01-08 02:48:48
【问题描述】:

我在基于 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) 的自定义异常?

【问题讨论】:

    标签: spring rest spring-boot exception-handling


    【解决方案1】:

    请求正文通过以下方式从 JSON 转换为 java 类型 org.springframework.http.converter.json.MappingJackson2HttpMessageConverter

    如果发生错误,则在 超类 org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter#readJavaType

    您可以继承 MappingJackson2HttpMessageConverter,覆盖 readJavaType(..) 并尝试在那里抛出您自己的异常或自定义的 HttpMessageNotReadableException。

    您很可能需要clone the input stream,使用一个尝试反序列化 JSON,另一个用于在需要引发异常时使用。 这可能会影响性能,但如果这不是问题,您可以尝试一下....

    【讨论】:

    • 谢谢,你的方法成功了。我创建了MappingJackson2HttpMessageConverter 的子类并覆盖了read 方法。为了让新的 Mapper 在 Boot 中工作,我只是在我的配置中声明为 @Bean,如下所示:@Bean public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() { return new PayloadCaptureMappingJackson2HttpMessageConverter(); }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-17
    • 2021-02-26
    • 1970-01-01
    • 2016-11-11
    相关资源
    最近更新 更多