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因为错误处理取决于异常处理程序中的方法顺序.因此,我不想通过引入多个类来扰乱顺序.
您可以使用@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)
| 归档时间: |
|
| 查看次数: |
2199 次 |
| 最近记录: |