我可以忽略BeanCreationException并注入null吗



我们的Spring连接了一些bean,其中包括使用Java 6构建的ActiveMQ类。我们的应用程序运行在客户的服务器上,所以我们不能保证他们安装了Java 6或更高版本。如果他们碰巧有Java5,那么应用程序就无法启动,因为BeanCreationException的类依赖于ActiveMQ(根本原因是UnsupportedClassVersionError)。

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

我的直觉是没有办法做到这一点,因为Spring需要能够保证我的应用程序在初始化后正确构建,但我想我无论如何都会问。对于如何实现我的最终目标,任何其他建议都将是有益的,并表示感谢。

我们使用的是Spring 3.0.6

谢谢!

如果您可以升级到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,您还可以返回一些伪实现,稍后您可以发现这些伪实现,并在应用程序尝试使用它时警告用户。

首先,任何属于java.lang.Error子类的可丢弃物通常被认为是不可恢复的。因此,尽管有可能抓住它们,但强烈反对:

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

然而,如果你要做的只是显示一条错误消息,那么你应该能够逃脱惩罚

因此,为了回到您的问题,我建议创建Spring的FactoryBean接口的实现,该接口将尝试加载ActiveMQ类。如果它工作,那么它可以从FactoryBean.getObject返回适当的对象。如果它失败(通过捕获的UnsupportedClassVersionError),那么它可以返回null,或者返回表示该条件的其他对象。

您可以创建一个工厂bean,并让它创建实际的ActiveMQbean。如果它不能初始化,工厂可能会返回一个伪/模拟实现,这样事情就不会中断。稍后你可以问工厂是否一切正常。

http://static.springsource.org/spring/docs/2.5.x/reference/beans.html#beans-工厂扩展工厂

最新更新