Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Jackson-400错误请求日志记录的SpringRest_Spring_Spring Mvc - Fatal编程技术网

使用Jackson-400错误请求日志记录的SpringRest

使用Jackson-400错误请求日志记录的SpringRest,spring,spring-mvc,Spring,Spring Mvc,我使用Jackson/JSON设置了SpringRest,一切正常 但是我故意在消息的结构中引入了一个错误,导致了一个400错误的请求。但服务器上没有日志输出。我预期的错误可能是“Jackson unknown property exception”之类的,但它被捕获,并向客户端发送了一个400错误,但服务器上没有异常日志 我不想清楚地调试服务器上的所有内容,但我希望像这样的Spring网络级异常清楚地标记为错误 打开此开关的正确方法是什么 谢谢 基于@Jukka的答案,您可以使用@Contro

我使用Jackson/JSON设置了SpringRest,一切正常

但是我故意在消息的结构中引入了一个错误,导致了一个400错误的请求。但服务器上没有日志输出。我预期的错误可能是“Jackson unknown property exception”之类的,但它被捕获,并向客户端发送了一个400错误,但服务器上没有异常日志

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

打开此开关的正确方法是什么


谢谢

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

@ExceptionHandler
@ResponseStatus(HttpStatus.BAD_REQUEST)
public void handle(HttpMessageNotReadableException e) {
    logger.warn("Returning HTTP 400 Bad Request", e);
}
这方面的一个例子如下:

@ControllerAdvice
public class ControllerConfig {

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

如果其他人偶然发现了这个问题,以下内容在SpringBoot2/Spring5中对我有效,不需要更改代码

我将
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'

在我的例子中,问题出现在我的
@ControllerAdvice
-annoted类中,它扩展了
ResponseEntityExceptionHandler
。当我从一些关于自定义异常处理的随机教程中获得处理程序代码时,我没有费心去检查那个超类在做什么(我的自定义异常处理工作得很好)

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

解决方案 重写所需的方法,或者根本不扩展该类


检查hanler-实现的方法列表。

我认为扩展ResponseEntityExceptionHandler不是强制性的。您可以在带有ExceptionHandler注释的ControllerAdvice类中创建多个处理程序方法,并且可以返回任何类型的响应。请查看下面的链接以了解更多详细信息和代码示例。

肯定有更通用的方法吗?我可以想象,抛出这些异常的spring框架在抛出异常之前会有一个日志调用。请注意,可以将此异常处理程序方法放置在超类中。另外,如果您想要向客户端返回错误消息(除了状态代码之外),这是一种方法。另一种方法是实现您自己的ExceptionHandlerResolver,以便在更“一般”的级别上进行日志记录。看看我想避免写任何代码。我是Spring框架的新手,但我将为所有内容设置调试级别,并将其删减到我认为需要的程度。非常感谢您的帮助。-1-随机代码存根,但不解释您试图实现的目标。这个去哪儿了?这有什么用?请解释一下,这很有帮助。但一定要将ControllerAdvice放在Spring扫描的包中:我的第一次尝试失败了,因为我将它放在了另一个包中,这是一种相当通用的方法,比我的控制器更通用的包,因此Spring没有注意到它。这似乎不再起作用了,因为Spring现在在其
ResponseEntityExceptionHandler#handleException
方法中为
HttpMessageEndableException
添加了
@ExceptionHandler
注释。当我将上述内容添加到代码中时,我得到了以下错误:
java.lang.IllegalStateException:映射到[class org.springframework.http.converter.httpMessageEndableException]的不明确@ExceptionHandler方法
因为我的异常映射程序与Spring的冲突。下面是我在上面提到的Spring异常处理程序的文档:这是最好的选择,应该接受:您可以在检查请求/响应映射/Jackson转换详细信息和失败时保持根日志级别以发出警告,并且不需要额外的异常处理程序。那么你就不会在大量的日志行中迷失自我了。你能给我详细的配置信息来设置调试吗。如何在log4j.properties中进行配置。关于使用属性文件配置log4j,网上有很多示例。您可以尝试以下文章:。基本上,您需要类似于
log4j.logger.org.springframework.web.servlet.mvc.method.annotation=DEBUG,console
的东西,但这将取决于您定义的附加器。使用Spring Boot,您只需将-Ddebug添加到VM选项中。或者使用SpringBoot,只需添加一个环境变量(例如,对于Kubernetes/OpenShift,直接到ConfigMap):日志记录\级别\组织\ SPRINGFRAMEWORK \ WEB \ SERVLET \ MVC \方法\注释:调试