1. 概要

このチュートリアルでは、Springorg。springframework。beans.factory。BeanCreationException。Beanの場合にスローされる非常に一般的な例外について説明します。 ] Factory は、bean定義のbeanを作成し、問題が発生します。 この記事では、この例外の最も一般的な原因とその解決策について説明します。

2. 原因: org.springframework.beans.factory.NoSuchBeanDefinitionException

Bean CreationException の最も一般的な原因は、コンテキストに存在しない注入しようとするSpringです。

たとえば、BeanABeanBを注入しようとしています。

@Component
public class BeanA {

    @Autowired
    private BeanB dependency;
    ...
}

Bean B がコンテキストで見つからない場合、次の例外がスローされます(Beanの作成エラー):

Error creating bean with name 'beanA': Injection of autowired dependencies failed; 
nested exception is org.springframework.beans.factory.BeanCreationException: 
Could not autowire field: private com.baeldung.web.BeanB cpm.baeldung.web.BeanA.dependency; 
nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: 
No qualifying bean of type [com.baeldung.web.BeanB] found for dependency: 
expected at least 1 bean which qualifies as autowire candidate for this dependency. 
Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

このタイプの問題を診断するには、最初にbeanが宣言されていることを確認します。

  • 要素を使用するXML構成ファイルのいずれか
  • または、Java @Configurationクラスで@Beanアノテーションを使用
  • または、 @Component @Repository @Service @Controller、で注釈が付けられ、クラスパススキャンがそのパッケージに対してアクティブになっています

また、Springが実際に構成ファイルまたはクラスを取得し、それらをメインコンテキストにロードすることも確認します。

3. 原因: org.springframework.beans.factory.NoUniqueBeanDefinitionException

bean作成例外の別の同様の原因は、Springがbeanをタイプ別、つまりそのインターフェイスによって挿入しようとし、コンテキスト内でそのインターフェイスを実装する2つ以上のbeanを見つけることです。 。

たとえば、BeanB1BeanB2はどちらも同じインターフェイスを実装しています。

@Component
public class BeanB1 implements IBeanB { ... }
@Component
public class BeanB2 implements IBeanB { ... }

@Component
public class BeanA {

    @Autowired
    private IBeanB dependency;
    ...
}

これにより、SpringBeanファクトリによって次の例外がスローされます。

Error creating bean with name 'beanA': Injection of autowired dependencies failed; 
nested exception is org.springframework.beans.factory.BeanCreationException: 
Could not autowire field: private com.baeldung.web.IBeanB com.baeldung.web.BeanA.b; 
nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: 
No qualifying bean of type [com.baeldung.web.IBeanB] is defined: 
expected single matching bean but found 2: beanB1,beanB2

4. 原因: org.springframework.beans.BeanInstantiationException

4.1. カスタム例外

次の行は、作成プロセス中に例外をスローする beanです。問題を簡単に理解するための簡単な例は、beanのコンストラクターで例外をスローすることです。

@Component
public class BeanA {

    public BeanA() {
        super();
        throw new NullPointerException();
    }
    ...
}

予想どおり、これにより、次の例外を除いてSpringが高速で失敗します。

Error creating bean with name 'beanA' defined in file [...BeanA.class]: 
Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: 
Could not instantiate bean class [com.baeldung.web.BeanA]: 
Constructor threw exception; 
nested exception is java.lang.NullPointerException

4.2. java .lang.InstantiationException

Bean InstantiationException が発生する可能性のある別の問題は、XMLで抽象クラスをbeanとして定義することです。 Java @Configuration ファイルでこれを行う方法がないため、これはXMLである必要があり、クラスパススキャンは抽象クラスを無視します。

@Component
public abstract class BeanA implements IBeanA { ... }

beanのXML定義は次のとおりです。

<bean id="beanA" class="com.baeldung.web.BeanA" />

この設定では、同様の例外が発生します。

org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'beanA' defined in class path resource [beansInXml.xml]: 
Instantiation of bean failed; 
nested exception is org.springframework.beans.BeanInstantiationException: 
Could not instantiate bean class [com.baeldung.web.BeanA]: 
Is it an abstract class?; 
nested exception is java.lang.InstantiationException

4.3. java .lang.NoSuchMethodException

beanにデフォルトのコンストラクターがなく、Springがそのコンストラクターを探してインスタンス化しようとすると、実行時例外が発生します。

@Component
public class BeanA implements IBeanA {

    public BeanA(final String name) {
        super();
        System.out.println(name);
    }
}

クラスパススキャンメカニズムがこのbeanを検出すると、障害は次のようになります。

Error creating bean with name 'beanA' defined in file [...BeanA.class]: Instantiation of bean failed; 
nested exception is org.springframework.beans.BeanInstantiationException: 
Could not instantiate bean class [com.baeldung.web.BeanA]: 
No default constructor found; 
nested exception is java.lang.NoSuchMethodException: com.baeldung.web.BeanA.<init>()

クラスパスのSpring依存関係に同じバージョンがない場合も同様の例外が発生する可能性があります。この種のバージョンの非互換性により、NoSuchMethodExceptionが発生する可能性があります。 APIの変更のため。 このような問題の解決策は、すべてのSpringライブラリがプロジェクト内でまったく同じバージョンであることを確認することです。

5. 原因: org.springframework.beans.NotWritablePropertyException

さらに別の可能性は、に対応するセッターメソッドがなくても、別のbean、 Bean B、を参照してbean、 Bean A、を定義することです。 ] Bean A

@Component
public class BeanA {
    private IBeanB dependency;
    ...
}
@Component
public class BeanB implements IBeanB { ... }

SpringXML構成は次のとおりです。

<bean id="beanA" class="com.baeldung.web.BeanA">
    <property name="beanB" ref="beanB" />
</bean>

繰り返しになりますが、このはXML構成でのみ発生する可能性があります。これは、Java @Configuration を使用すると、コンパイラーによってこの問題の再現が不可能になるためです。

もちろん、この問題を解決するには、IBeanBのセッターを追加する必要があります。

@Component
public class BeanA {
    private IBeanB dependency;

    public void setDependency(final IBeanB dependency) {
        this.dependency = dependency;
    }
}

6. 原因: org.springframework.beans.factory.CannotLoadBeanClassException

Springは、定義されたbean のクラスをロードできない場合に、この例外をスローします。 これは、SpringXML構成に対応するクラスがないbeanが含まれている場合に発生する可能性があります。 たとえば、クラス BeanZ が存在しない場合、次の定義は例外になります。

<bean id="beanZ" class="com.baeldung.web.BeanZ" />

ClassNotFoundException の根本的な原因と、この場合の完全な例外は次のとおりです。

nested exception is org.springframework.beans.factory.BeanCreationException: 
...
nested exception is org.springframework.beans.factory.CannotLoadBeanClassException: 
Cannot find class [com.baeldung.web.BeanZ] for bean with name 'beanZ' 
defined in class path resource [beansInXml.xml]; 
nested exception is java.lang.ClassNotFoundException: com.baeldung.web.BeanZ

7. BeanCreationExceptionの子

7.1. org.springframework.beans.factory.BeanCurrentlyInCreationException

BeanCreationException のサブクラスの1つは、 BeanCurrentlyInCreationExceptionです。これは通常、コンストラクターインジェクションを使用する場合に発生します。たとえば、循環依存の場合です。

@Component
public class BeanA implements IBeanA {
    private IBeanB beanB;

    @Autowired
    public BeanA(final IBeanB beanB) {
        super();
        this.beanB = beanB;
    }
}
@Component
public class BeanB implements IBeanB {
    final IBeanA beanA;

    @Autowired
    public BeanB(final IBeanA beanA) {
        super();
        this.beanA = beanA;
    }
}

Springはこの種の配線シナリオを解決できず、最終結果は次のようになります。

org.springframework.beans.factory.BeanCurrentlyInCreationException: 
Error creating bean with name 'beanA': 
Requested bean is currently in creation: Is there an unresolvable circular reference?

完全な例外は非常に冗長です。

org.springframework.beans.factory.UnsatisfiedDependencyException: 
Error creating bean with name 'beanA' defined in file [...BeanA.class]: 
Unsatisfied dependency expressed through constructor argument with index 0 
of type [com.baeldung.web.IBeanB]: : 
Error creating bean with name 'beanB' defined in file [...BeanB.class]: 
Unsatisfied dependency expressed through constructor argument with index 0 
of type [com.baeldung.web.IBeanA]: : 
Error creating bean with name 'beanA': Requested bean is currently in creation: 
Is there an unresolvable circular reference?; 
nested exception is org.springframework.beans.factory.BeanCurrentlyInCreationException: 
Error creating bean with name 'beanA': 
Requested bean is currently in creation: 
Is there an unresolvable circular reference?; 
nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: 
Error creating bean with name 'beanB' defined in file [...BeanB.class]: 
Unsatisfied dependency expressed through constructor argument with index 0 
of type [com.baeldung.web.IBeanA]: : 
Error creating bean with name 'beanA': 
Requested bean is currently in creation: 
Is there an unresolvable circular reference?; 
nested exception is org.springframework.beans.factory.BeanCurrentlyInCreationException: 
Error creating bean with name 'beanA': 
Requested bean is currently in creation: Is there an unresolvable circular reference?

7.2. org.springframework.beans.factory.BeanIsAbstractException

このインスタンス化例外は、Beanファクトリが抽象として宣言されたbeanを取得してインスタンス化しようとしたときに発生する可能性があります。

public abstract class BeanA implements IBeanA {
   ...
}

XML構成で次のように宣言します。

<bean id="beanA" abstract="true" class="com.baeldung.web.BeanA" />

別のbeanをインスタンス化するときのように、BeanAをSpringコンテキストから名前で取得しようとすると次のようになります。

@Configuration
public class Config {
    @Autowired
    BeanFactory beanFactory;

    @Bean
    public BeanB beanB() {
        beanFactory.getBean("beanA");
        return new BeanB();
    }
}

これにより、次の例外が発生します。

org.springframework.beans.factory.BeanIsAbstractException: 
Error creating bean with name 'beanA': Bean definition is abstract

そして、完全な例外スタックトレース:

org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'beanB' defined in class path resource 
[org/baeldung/spring/config/WebConfig.class]: Instantiation of bean failed; 
nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: 
Factory method 
[public com.baeldung.web.BeanB com.baeldung.spring.config.WebConfig.beanB()] threw exception; 
nested exception is org.springframework.beans.factory.BeanIsAbstractException: 
Error creating bean with name 'beanA': Bean definition is abstract

8. 結論

この記事では、Springの BeanCreationException につながる可能性のあるさまざまな原因と問題をナビゲートする方法を学び、これらすべての問題を修正する方法をよく理解しました。

すべての例外例の実装は、githubプロジェクトにあります。 これはEclipseベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。