Spring MVC Spring REST使用Jackson- 400错误请求日志记录

e7arh2l6  于 2022-11-15  发布在  Spring
关注(0)|答案(6)|浏览(157)

我使用Jackson/JSON将Spring REST设置得很好,一切正常。
但是我故意在消息结构中引入了一个错误,导致了一个400 - Bad请求。但是服务器上没有日志输出。我预期的错误应该是“Jackson未知属性异常”之类的,但是它被捕获了,并且向客户端发送了一个400错误,但是服务器上没有异常日志。
我不想清楚地调试服务器上的所有内容,但我希望像这样的Spring Web络级异常清楚地标记为error。
正确的开机方式是什么?
谢谢你!

kzmpq1sx

kzmpq1sx1#

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

voase2hg2#

基于@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;
    }
}
zujrkrfu

zujrkrfu3#

如果其他人在这个问题上犯了错误,下面的代码在Sping 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'
dxxyhpgq

dxxyhpgq4#

您可以在application.properties中设定log层级来两柴这个属性。

logging.level.org.springframework.web= DEBUG
nwnhqdif

nwnhqdif5#

在我的例子中,问题出在我的@ControllerAdvice-annoted类中,它扩展了ResponseEntityExceptionHandler。当我从一些关于自定义异常处理的随机教程中获得处理程序代码时,我没有费心去检查那个超类在做什么(我的自定义异常处理工作得很好)。
问题是ResponseEntityExceptionHandler.handleException()处理MethodArgumentNotValidException沿着其他Spring MVC异常,将处理逻辑委托给特定的handle方法。由于我没有为任何这样的方法(在本例中为handleMethodArgumentNotValid())提供返回我自己的响应主体的实现,我最终使用了返回空主体响应的默认实现:)。

溶液

重写所需的方法,或者根本不扩展该类。
检查ResponseEntityExceptionHandler docs以获得实现的hanler方法的列表。

mccptt67

mccptt676#

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

相关问题