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

我正在创建一个框架,希望在以后的所有项目中都可以重用。如果子项目没有定义@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:“自动装配”继承与依赖注入 - java

Improve this question 我通常以常见的简单形式使用Spring框架: 控制器服务存储库通常,我会在CommonService类中放一个通用服务,并使所有其他服务扩展到类中。一个开发人员告诉我,最好在每个服务中插入CommonClass而不是使用继承。我的问题是,有一个方法比另一个更好吗? JVM或性能是否会受到另一个影响?更新资料Comm…

Spring Data Cassandra的事务管理 - java

我正在使用Spring和Cassandra作为基础数据库。曾提到过弹簧伞项目“ spring data cassandra”。与休眠不同,在这里无法找到如何管理事务。如果您中的某些人已经合并,请共享要包含的事务管理器的详细信息。 参考方案 Cassandra不支持传统(ACID)的事务。在某些特殊情况下,可以通过一些构造来实现事务原子性,例如原子批处理(请参…

Spring Boot:java.time.Duration的默认序列化从字符串更改为数字 - java

我们最近从Spring Boot 2.1.9升级到2.2.1,这导致我们的测试失败。调查导致结果,默认情况下java.time.Duration类型现在序列化为不同的序列。现在,我们将得到"PT15M",而不是在JSON消息中包含字符串"900.0"。 POJO定义如下所示@JsonProperty(required …

IntelliJ Spring MVC教程部署 - java

我尝试了tutorial,当我尝试部署webapp(IntelliJ 13.1.4 Ultimate)时,出现了一个奇怪的错误,如下面的屏幕快照所示。解决此错误的方法是什么? org.jdom.input.JDOMParseException: Error on line 742: The content of elements must consist o…

春季安全值得付出努力 - java

我一直在关注春季安全性,并注意到它是多么大的包装。我想知道是否值得花一些时间来加强这一点。Spring Security 2.0+为您节省了大量时间,还是以任何方式简化了您的项目? java参考方案 几年前,我考虑将其用于Spring项目,并选择了它,因为它是一个非常繁琐的框架,恕我直言,它提供的灵活性不是必需的。 (据我估计)减少我们自己的身份验证/授权的…