我可以忽略BeanCreationException并注入null吗?

时间:2012-01-17 22:52:10

标签: java spring dependency-injection java-6 java-5

我们的情况是,我们的Spring连接了一些包含使用Java 6构建的ActiveMQ类的bean。我们的应用程序在客户的服务器上运行,因此我们无法保证它们安装了Java 6或更高版本。如果碰巧有Java 5,则应用程序无法启动,因为BeanCreationException s的类依赖于ActiveMQ(根本原因是UnsupportedClassVersionError)。

所以我的问题是,有没有办法忽略BeanCreationException并仍然启动应用程序?我希望能够显示一条错误消息,说明他们需要安装Java 6或更高版本,但由于应用程序甚至无法启动,我从来没有机会这样做。

我的预感是没有办法做到这一点,因为Spring需要能够保证我的应用程序在初始化后正确构建,但我想我还是会问。关于如何实现我的最终目标的任何其他建议也会有所帮助和赞赏。

我们正在使用Spring 3.0.6

谢谢!

3 个答案:

答案 0 :(得分:4)

如果可以升级到Spring 3.1(稳定版),请利用Java配置:

@Bean
public SomeBean public someBean() {
    if(isEverythingOkWithJavaVersion()) {
        return new CorrectBean();
    } else {
        return null;
    }
}

或:

@Bean
public SomeBean public someBean() {
    try {
        return new CorrectBean();
    } catch(UnsupportedClassVersionError e) {
        log.warn("", e);
        return null;
    }
}

在旧版本的Spring中FactoryBean可能用于实现相同的逻辑。您可能还会返回一些您可以稍后发现并在应用程序尝试使用它时警告用户的虚假实现,而不是返回null

答案 1 :(得分:0)

首先,作为java.lang.Error的子类的任何throwable通常被认为是不可恢复的。因此虽然有可能抓住它们,it's strongly discouraged

  

ErrorThrowable的子类,表示合理的应用程序不应该试图捕获的严重问题。大多数此类错误都是异常情况。

但是,如果您要做的只是显示错误消息,那么您应该可以使用它。

回到你的问题,我建议使用Spring的FactoryBean接口creating an implementation,它会尝试加载ActiveMQ类。如果它有效,那么它可以从FactoryBean.getObject返回适当的对象。如果失败(通过捕获的UnsupportedClassVersionError),则它可以返回null或表示该条件的其他对象。

答案 2 :(得分:0)

您可以创建一个工厂bean并让它创建实际的ActiveMQ bean。如果无法初始化,工厂可以返回虚拟/模拟实现,因此事情不会中断。之后你可以询问工厂是否一切顺利。

http://static.springsource.org/spring/docs/2.5.x/reference/beans.html#beans-factory-extension-factorybean