20

我想在我的代码中捕获 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

4 回答 4

16

方法someBean应该 catchSomeException然后 throw BeanCreationExceptionwithSomeException作为原因:

@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);
    }
  }
}
于 2015-05-14T16:15:34.177 回答
3

只是为了完整性。

您还可以延迟初始化 bean 并在第一次使用 bean 时捕获异常。

弹簧配置:

<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
         }
    }
}
于 2015-01-27T09:57:06.903 回答
2

你不应该那样做。这就是让 Spring 为您创建 bean 的全部意义所在。如果您要使用(如上)创建自己的 bean new,为什么要使用 Spring 为您创建 bean?

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

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

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

于 2012-11-22T08:19:42.740 回答
0

如果您预计在创建 bean 期间会失败并且 bean 对于应用程序的其余部分不是必需的(非常合法的情况),您可以按照您的建议通过在 @Bean 方法主体中捕获所有失败异常并返回null以指示bean 创建失败。在这种情况下,bean 不会被添加到 Spring 应用程序上下文中,如果给定 bean 上没有强制依赖关系,上下文构造将成功。

于 2015-08-14T09:47:41.927 回答