我已经声明了一个通过工厂方法实例化的bean。工厂方法调用一些远程服务。因此,该方法已被声明为抛出异常。
当一切正常时,正确地实例化bean。但是,当工厂方法抛出异常时,一切都会出错。因为我声明的bean是从另一个bean引用的。
如果工厂方法抛出异常,我想设置一个默认值。
我的配置文件的一部分如下:
<bean id="Helper" class="com.test.Helper">
<constructor-arg ref="myBean" />
</bean>
<bean id="myBean" class="com.test.Factory" factory-method="getBean" />
getBean()方法如下:
Factory {
public static Bean getBean() throws Exception{
//Invokes some Remote Services and does some processing
....
....
//returns bean object
}
}
请帮我解决这个问题。我不允许修改工厂方法。
答案 0 :(得分:3)
如果bean或factory方法在创建过程中抛出异常,则整个应用程序上下文启动失败(我想这就是“一切都开始出错”的意思)。在Spring方面你无能为力。
如果要返回某个默认值,只需捕获自定义工厂中的异常,记录它并返回该默认值。如果您无法修改现有工厂,请考虑@Configuration
方法:
@Configuration
public SafeCfg {
@org.springframework.context.annotation.Bean
public Bean bean() {
try {
return Factory.getBean();
} catch(Exception e) {
return //some default Bean
}
}
}
它从Spring 3.0开始运行。只需将它放在某处,以便应用程序上下文可以将其拾起。
但我怀疑这是你想要的。即使外部系统可用,您仍将使用默认的回退值。你期望它能像这样工作吗?更高级的方法是使用延迟代理(Spring支持它:Is there a spring lazy proxy factory in Spring?)并仅在需要时初始化它并在破坏时刷新。