Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.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
Java @jackson的例外处理程序';s无效格式异常_Java_Spring_Spring Boot_Jackson - Fatal编程技术网

Java @jackson的例外处理程序';s无效格式异常

Java @jackson的例外处理程序';s无效格式异常,java,spring,spring-boot,jackson,Java,Spring,Spring Boot,Jackson,在spring boot应用程序中,我希望使用通用异常处理程序捕获和处理com.fasterxml.jackson.databind.exc.InvalidFormatException-异常,并在遇到异常时返回400 问题是,没有调用该异常的异常处理程序。而是返回一个偶然的500错误 我错过了什么? 这是否与InvalidFormatException是嵌套异常有关? 我该如何解决这个问题 代码异常处理程序 @ControllerAdvice(basePackages = "packe.pat

在spring boot应用程序中,我希望使用通用异常处理程序捕获和处理
com.fasterxml.jackson.databind.exc.InvalidFormatException
-异常,并在遇到异常时返回
400

问题是,没有调用该异常的异常处理程序。而是返回一个偶然的500错误

我错过了什么? 这是否与InvalidFormatException是嵌套异常有关? 我该如何解决这个问题

代码异常处理程序

@ControllerAdvice(basePackages = "packe.path.to.rest.controllers")
public class GeneralExceptionHandler {

   // .. other working exception handlers...

@ExceptionHandler(InvalidFormatException.class)
    public ResponseEntity<ErrorMessage> processJsonInvalidFormatException(InvalidFormatException e) {
        log.error("Invalid Json Format Exceptioon occurred");

        HttpStatus status = HttpStatus.BAD_REQUEST;
        ErrorMessage msg = new ErrorMessage(
            status.value(),
            status.getReasonPhrase(),
            e.getMessage()
        );

        return new ResponseEntity(msg, status);
    }
而不是:

@ControllerAdvice(basePackages = "packe.path.to.rest.controllers")
试试看:

@ControllerAdvice

原因可能是异常被抛出了
jackson
包中,因此,在您自己的包之外。

您可以扩展
ResponseEntityExceptionHandler
并覆盖
HandleHttpMessageNodeable
方法,如下所示:

@ControllerAdvice
public class GeneralExceptionHandler {
...
@Override
    protected ResponseEntity<Object> handleHttpMessageNotReadable(HttpMessageNotReadableException ex, HttpHeaders headers, HttpStatus httpStatus, WebRequest request) {
        HttpStatus status = HttpStatus.BAD_REQUEST;
        ErrorMessage msg = new ErrorMessage(
            status.value(),
            status.getReasonPhrase(),
            ex.getMessage()
        );
        return new ResponseEntity(msg, status);
    }
...

}
@ControllerAdvice
公共类GeneralExceptionHandler{
...
@凌驾
受保护的ResponseEntity HandleHttpMessageGenoTreadable(HttpMessageGenoTreadableException ex、HttpHeaders标头、HttpStatus HttpStatus、WebRequest请求){
HttpStatus status=HttpStatus.BAD_请求;
ErrorMessage msg=新的ErrorMessage(
status.value(),
status.getReasonPhrase(),
例如getMessage()
);
返回新的响应(消息、状态);
}
...
}

Ahh我明白了:纠正我的错误,但是如果将
com.fasterxml.jackson.databind.exc
添加到basePackages参数中,它会起作用吗?我想是的。但我通常选择更通用的路径,比如:
com.fasterxml.jackson
,遗憾的是,添加fasterxml包不起作用。然后我将尝试使用一个不受限制的处理程序。使用一个通用的@ControllerAdrive注释处理程序也不起作用。哼。。。你能分享完整的堆栈跟踪吗?错误似乎与解析某些内容有关。
@ControllerAdvice
public class GeneralExceptionHandler {
...
@Override
    protected ResponseEntity<Object> handleHttpMessageNotReadable(HttpMessageNotReadableException ex, HttpHeaders headers, HttpStatus httpStatus, WebRequest request) {
        HttpStatus status = HttpStatus.BAD_REQUEST;
        ErrorMessage msg = new ErrorMessage(
            status.value(),
            status.getReasonPhrase(),
            ex.getMessage()
        );
        return new ResponseEntity(msg, status);
    }
...

}