如何在bean上提供@ControllerAdvice条件?

mem*_*und 2 java spring spring-mvc spring-boot

我正在创建一个框架,我希望在以后的所有项目中重用它.如果子项目没有定义a @ControllerAdvice,我希望我的框架自动初始化异常处理的默认建议.

public class ExHandler implements IAdvice {
    ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.NOT_FOUND)
    @ResponseBody
    public ErrorDTO default(xception e) {
        return new ErrorDTO();
    }
}
Run Code Online (Sandbox Code Playgroud)

我尝试如下,但不起作用:

@Configuration
static class MyConfig {
    @ControllerAdvice
    @ConditionalOnMissingBean(IAdvice.class)
    static class AdviceExHandler extends ExHandler {

    }
}
Run Code Online (Sandbox Code Playgroud)

在子项目中:

@ControllerAdvice
public class SubHandler extends ExHandler {
}
Run Code Online (Sandbox Code Playgroud)

结果:它有效.但是:如果子项目没有定义ExHandler,那么bean根本没有初始化!但为什么?

旁注:我正在尝试防止mutliple,ControllerAdvice因为错误处理取决于异常处理程序中的方法顺序.因此,我不想通过引入多个类来扰乱顺序.

Igo*_*bak 7

您可以使用@ConditionalOnMissingBean(annotation = ControllerAdvice.class)使用ControllerAdvice批注配置缺少bean的条件.

@ControllerAdvice
public abstract class FrameworkAdvice {
...
}
Run Code Online (Sandbox Code Playgroud)

并有条件地配置它:

@Configuration
@ConditionalOnMissingBean(annotation = ControllerAdvice.class)
public class FrameworkAdviceConfig {
    @Bean
    public FrameworkAdvice frameworkAdvice() {
        return new FrameworkAdvice() {
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

如果项目中有另一个控制器建议,则将使用它.

@ControllerAdvice
public class CustomAdvice {
...
}
Run Code Online (Sandbox Code Playgroud)