我正在创建一个框架,希望在以后的所有项目中都可以重用。如果子项目没有定义@ControllerAdvice
,我希望我的框架自动初始化默认的Advice,以进行异常处理。
public class ExHandler implements IAdvice {
ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
@ResponseBody
public ErrorDTO default(xception e) {
return new ErrorDTO();
}
}
我尝试如下,但不起作用:
@Configuration
static class MyConfig {
@ControllerAdvice
@ConditionalOnMissingBean(IAdvice.class)
static class AdviceExHandler extends ExHandler {
}
}
在子项目中:
@ControllerAdvice
public class SubHandler extends ExHandler {
}
结果:有效。但是:如果子项目未定义
ExHandler
,则根本不会初始化Bean!但为什么?旁注:我正在尝试防止mutliple
ControllerAdvice
,因为错误处理取决于异常处理程序中方法的顺序。因此,我不想通过引入多个类来弄乱顺序。 最佳答案
您可以使用@ConditionalOnMissingBean(annotation = ControllerAdvice.class)通过ControllerAdvice注释在缺少的bean上配置条件。
@ControllerAdvice
public abstract class FrameworkAdvice {
...
}
并有条件地配置它:
@Configuration
@ConditionalOnMissingBean(annotation = ControllerAdvice.class)
public class FrameworkAdviceConfig {
@Bean
public FrameworkAdvice frameworkAdvice() {
return new FrameworkAdvice() {
};
}
}
如果项目中还有其他控制器建议,则将使用该建议。
@ControllerAdvice
public class CustomAdvice {
...
}
关于java - 如何在bean上提供@ControllerAdvice条件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44827031/