8

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

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

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

我们正在使用 Spring 3.0.6

谢谢!

4

3 回答 3

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,您还可能返回一些您以后可以发现的虚假实现,并在应用程序尝试使用它时警告用户。

于 2012-01-17T23:06:47.610 回答
0

首先,任何作为子类的 throwablejava.lang.Error通常都被认为是不可恢复的。因此,虽然有可能抓住它们,但强烈建议不要这样做

AnError是它的子类,Throwable它指示合理的应用程序不应尝试捕获的严重问题。大多数此类错误是异常情况。

但是,如果您要做的只是显示一条错误消息,那么您应该能够摆脱它。

所以回到你的问题,我建议创建一个SpringFactoryBean接口的实现,它会尝试加载 ActiveMQ 类。如果它有效,那么它可以从FactoryBean.getObject. 如果失败(通过 catch UnsupportedClassVersionError),那么它可以返回 anull或其他表示该条件的对象。

于 2012-01-17T23:06:00.373 回答
0

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

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

于 2012-01-17T23:06:24.210 回答