Spring - 捕获bean创建异常

时间:2012-11-22 08:13:08

标签: java spring exception configuration

我想在我的代码中捕获bean实例化异常。我有什么选择? 一种方法是使用基于Java的容器配置:

@Configuration
public class AppConfig {
  @Bean
  public SomeBean someBean() {
    try {
      return new SomeBean(); // throws SomeException
    } catch(SomeException se) {
      return new SomeBeanStub();
    }
  }
}

是否可以使用基于XML或基于注释的配置使用Spring定义bean实例化的异常处理程序?

4 个答案:

答案 0 :(得分:11)

方法someBean应该抓住SomeException,然后以SomeException作为原因抛出BeanCreationException

@Configuration
public class AppConfig {
  @Bean
  public SomeBean someBean() {
    try {
      return new SomeBean(); // throws SomeException
    } catch (SomeException se) {
      throw new BeanCreationException("someBean", "Failed to create a SomeBean", se);
    }
  }
}

答案 1 :(得分:2)

你不应该这样做。这就是让Spring为你创建一个bean的重点。如果要使用new创建自己的bean(如上所述),为什么要使用Spring为您创建bean?

您确实可以为自己分配对象并继续工作,而不是依赖注入和所有。

虽然我理解问题背后的本质。我认为最好是在服务器加载期间失败。原因:应用程序不会处于不一致状态。假设您捕获异常并执行一些清洁,但其他类将期望该bean存在而不存在。

因此最好在初始化时失败,以便应用程序保持一致。虽然我不知道其他任何合法的做法。

答案 2 :(得分:2)

只是为了完整。

你也可以懒惰初始化bean并在第一次使用bean时捕获异常。

spring config:

<bean id="a" class="A" lazy-init="true" />

在java中:

import org.springframework.beans.factory.BeanCreationException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;

public class B {

    @Autowired
    @Lazy
    A a;

    public void foo(){
         try{
               a.foo();
         } catch (BeanCreationException e){
               // ignore if you want
         }
    }
}

答案 3 :(得分:0)

如果您希望在bean创建期间出现故障并且bean对于应用程序的其余部分(非常合理的情况)不是强制性的,您可以按照建议通过捕获@Bean方法体中的所有失败异常并返回{ {1}}表示bean创建失败。 在这种情况下,bean不会被添加到Spring应用程序上下文中,如果给定bean没有强制依赖,则上下文构造将成功。