使用Jackson的Spring REST - 400错误请求记录

时间:2013-06-26 17:44:11

标签: spring spring-mvc

我使用Jackson / JSON设置了Spring REST,一切正常。

但是我故意在消息结构中引入了错误,导致了400错误请求。但是服务器上没有日志输出。我期待的错误将是“杰克逊未知属性异常”或其他什么,但它被捕获并且400错误被发送到客户端,但没有在服务器上记录异常。

我不想清楚地调试服务器上的所有内容,但我希望像这样的Spring网络级异常明确标记为错误。

启用此功能的正确方法是什么?

谢谢!

5 个答案:

答案 0 :(得分:42)

@ExceptionHandler
@ResponseStatus(HttpStatus.BAD_REQUEST)
public void handle(HttpMessageNotReadableException e) {
    logger.warn("Returning HTTP 400 Bad Request", e);
}

答案 1 :(得分:35)

在@ Jukka的答案基础上,您可以使用@ControllerAdvice(在Spring 3.2中引入)为所有控制器全局启用此功能。它确实需要一些代码,但根据我的经验,您通常最终需要一个全局错误处理配置,这允许您设置断点/轻松检查问题。

以下是一个例子:

@ControllerAdvice
public class ControllerConfig {

    @ExceptionHandler
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public void handle(HttpMessageNotReadableException e) {
        log.warn("Returning HTTP 400 Bad Request", e);
        throw e;
    }
}

答案 2 :(得分:6)

万一其他人在这个问题上迷失了方向,以下内容在Spring Boot 2 / Spring 5中对我有用,并且不需要更改代码。

我将org.springframework.web.servlet.mvc.method.annotation的日志级别设置为DEBUG。就我而言,我在客户端代码中看到了400个响应,但是在服务器端却没有日志记录(即使使用自定义错误处理程序)。更改该日志级别后,问题很明显:

DEBUG 172.19.0.16     cs              2018-Jun-08 20:55:08.415 [https-jsse-nio-443-exec-9] - method.annotation.RequestResponseBodyMethodProcessor[line ?] - Read [class java.lang.String] as "application/xml;charset=UTF-8" with [org.springframework.http.converter.xml.MarshallingHttpMessageConverter@2de50ee4]
DEBUG 172.19.0.16     cs              2018-Jun-08 20:55:08.418 [https-jsse-nio-443-exec-9] - method.annotation.ServletInvocableHandlerMethod[line ?] - Failed to resolve argument 0 of type 'java.lang.String'
org.springframework.beans.TypeMismatchException: Failed to convert value of type 'core.dto.RequestDTO' to required type 'java.lang.String'

答案 3 :(得分:0)

就我而言,问题出在我的@ControllerAdvice注释的类中,该类扩展了ResponseEntityExceptionHandler。当我从某个有关自定义异常处理的随机教程中获得该处理程序代码时,我不必费心检查该超类在做什么(我的自定义异常处理工作得很好)。

问题是ResponseEntityExceptionHandler.handleException()处理MethodArgumentNotValidException以及其他Spring MVC异常,将处理逻辑委托给特定的处理方法。由于我没有为任何这样的方法(在本例中为handleMethodArgumentNotValid())提供返回自己的响应主体的实现,因此我最终使用了默认的实现,该实现返回的响应为null:)。

解决方案

覆盖您需要的方法或根本不扩展该类的方法。

检查ResponseEntityExceptionHandler docs中已实现的hanler方法列表。

答案 4 :(得分:0)

我认为扩展ResponseEntityExceptionHandler并不是强制性的。您可以在带有ExceptionHandler注释的ControllerAdvice类中创建多个处理程序方法,并且可以返回任何类型的响应。请检查下面的链接以获取更多详细信息和代码示例。 https://www.thetechnojournals.com/2019/11/how-to-handle-exceptions-in-rest.html