我正在创建一个框架,希望在以后的所有项目中都可以重用。如果子项目没有定义@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/

10-08 22:37