首页 > 解决方案 > Spring Boot 中多个项目中的错误处理程序

问题描述

我目前正在使用 Spring Boot 中不同项目中的不同服务。

我已经制作了一个错误处理程序,它将成为所有项目的 JAR,所以当我有

com.my.package在所有项目中,错误处理程序都可以正常工作。

com.my.package.Controller
com.my.package.Entity
...

我的异常响应:

    "code": 400,
    "message": "'id' must be java.lang.Integer",
    "status": "BAD_REQUEST"
}

但问题是当我有

com.my.package.p1-> 对于项目 p1

com.my.package.p2-> 对于项目 p2

com.my.package.p1.Controller
com.my.package.p1.Entity
...
com.my.package.p2.Controller
com.my.package.p2.Entity
...

错误处理程序似乎在其工作中失败,并且默认处理程序解决了错误,而不是我的。

{
    "timestamp": "2019-09-30T23:58:57.379+0000",
    "status": 400,
    "error": "Bad Request",
    "message": "Failed to convert value of type 'java.lang.String' to required type 'java.lang.Integer'; nested exception is java.lang.NumberFormatException: For input string: \"j\"",
    "path": "/api/department/j"
}

这些是我的 JAR 中的课程

//@RestControllerAdvice(basePackages = "com.my.package")
@ControllerAdvice
public class GlobalControllerExceptionHandler {

    private static final Logger LOGGER = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());

      //405
    @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
    @ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED)
    protected GlobalException processMethodNotSupportedException(final HttpRequestMethodNotSupportedException ex) {
        LOGGER.error("Method not allowed");  
        return new GlobalException(405, "Method not allowed",HttpStatus.METHOD_NOT_ALLOWED);
    }

...

如您所见,我尝试使用@RestControllerAdvice 和@ControllerAdvice,并尝试使用注释basePackages但没有成功的结果。

我还上了另一堂课:

@Configuration
@ComponentScan("com.my.package")
@EntityScan("com.my.package")
public class SharedBeanReference {

}

但同样的结果。

有人可以帮我弄清楚发生了什么吗?

标签: javaspring-bootexceptionjarmicroservices

解决方案


您可以尝试使用以下注释指定控制器建议的基本包:

@ControllerAdvice(basePackages = "com.my.package")
public class GlobalControllerExceptionHandler {

    private static final Logger LOGGER = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());

      //405
    @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
    @ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED)
    protected GlobalException processMethodNotSupportedException(final HttpRequestMethodNotSupportedException ex) {
        LOGGER.error("Method not allowed");  
        return new GlobalException(405, "Method not allowed",HttpStatus.METHOD_NOT_ALLOWED);
    }

...

对于 @ExceptionHandler 方法,在特定通知 bean 的处理程序方法中,根异常匹配将优于仅匹配当前异常的原因。但是,高优先级通知上的原因匹配仍将优先于低优先级通知 bean 上的任何匹配(无论是根级别还是原因级别)。因此,请在具有相应顺序的优先通知 bean 上声明您的主根异常映射。

或者您可以尝试以下方法:

  • @Priority尝试使用or注释为控制器建议类提供更高的优先级或顺序@Order,以使其匹配。
  • 您需要确保@ControllerAdvice该类在您的组件扫描基础包下。

参考文档 官方文档


推荐阅读