【问题标题】:Error Handler in Multiple Projects in Spring BootSpring Boot 中多个项目中的错误处理程序
【发布时间】:2020-01-30 06:20:36
【问题描述】:

我目前在 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 {

}

但结果相同。

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

【问题讨论】:

    标签: java spring-boot exception jar microservices


    【解决方案1】:

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

    @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 上。作为一个 因此,请在 a 上声明您的主根异常映射 具有相应顺序的优先建议 bean。

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

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

    参考doc 官方Doc

    【讨论】:

    • 您好,感谢您的回复,我已经在基本包中获得了带有@ControllerAdvice 的文件,我在注释中添加了basePackage=com.my.package,但我仍然得到相同的结果。我还添加了@Priority,但没有变化。我尝试在项目中将应用程序文件更改为基本包(来自com.my.package.p1' to com.my.package',它可以正常工作。但我真的不想要这个。
    • 尝试在@ControllerAdvice注解中添加所有相关的包。像@ControllerAdvice(basepackages={......p1,...p2..})
    猜你喜欢
    • 2018-07-18
    • 2016-05-22
    • 2020-06-25
    • 1970-01-01
    • 2017-07-28
    • 2020-11-27
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    相关资源
    最近更新 更多