我们的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
子类的可丢弃物通常被认为是不可恢复的。因此,尽管有可能抓住它们,但强烈反对:
Error
是Throwable
的一个子类,它表示一个合理的应用程序不应该试图捕获的严重问题。大多数这样的错误都是异常情况。
然而,如果你要做的只是显示一条错误消息,那么你应该能够逃脱惩罚
因此,为了回到您的问题,我建议创建Spring的FactoryBean
接口的实现,该接口将尝试加载ActiveMQ类。如果它工作,那么它可以从FactoryBean.getObject
返回适当的对象。如果它失败(通过捕获的UnsupportedClassVersionError
),那么它可以返回null
,或者返回表示该条件的其他对象。
您可以创建一个工厂bean,并让它创建实际的ActiveMQbean。如果它不能初始化,工厂可能会返回一个伪/模拟实现,这样事情就不会中断。稍后你可以问工厂是否一切正常。
http://static.springsource.org/spring/docs/2.5.x/reference/beans.html#beans-工厂扩展工厂