20

コードで Bean インスタンス化の例外をキャッチしたいと考えています。どのようなオプションがありますか? これを行う 1 つの方法は、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はキャッチしてから、原因としてSomeExceptionスローBeanCreationExceptionする必要があります。SomeException

@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 に答える