春の不満足な依存

1.概要

このクイックチュートリアルでは、Springの UnsatisfiedDependencyException 、その原因、および回避方法について説明します。

2. UnsatisfiedDependencyException の原因

  • UnsatisfiedDependencyException は、その名のとおり、Beanまたはプロパティの依存関係が満たされていない場合にスローされます。

これは、SpringアプリケーションがBeanを接続しようとしたときに、必須の依存関係の1つを解決できない場合に発生する可能性があります。

3.アプリケーション例

InventoryRepositoryに依存する PurchaseDeptService__というサービスクラスがあるとします。

@Service
public class PurchaseDeptService {
    public PurchaseDeptService(InventoryRepository repository) {
        this.repository = repository;
    }
}
public interface InventoryRepository {
}
@Repository
public class ShoeRepository implements InventoryRepository {
}
@SpringBootApplication
public class SpringDependenciesExampleApplication {

    public static void main(String[]args) {
        SpringApplication.run(SpringDependenciesExampleApplication.class, args);
    }
}

今のところ、これらのクラスはすべて com.baeldung.dependency.exception.app という名前の同じパッケージに入っているとします。

このSpring Bootアプリケーションを実行すると、すべてうまくいきます。設定手順を省略した場合、どのような問題が発生する可能性があるかを見てみましょう。

4.コンポーネントアノテーションがありません

それでは、 ShoeRepository クラスから __ @ Repository __アノテーションを削除しましょう。

public class ShoeRepository implements InventoryRepository {
}

アプリケーションを再起動すると、次のエラーメッセージが表示されます。__UnsatisfiedDependencyException:名前が「purchaseDeptService」のBeanの作成中にエラーが発生しました。

Springは、 ShoeRepository Beanをワイヤリングしてアプリケーションコンテキストに追加するように指示されていないため、投入して例外をスローすることはできませんでした。

@ Repository アノテーションを ShoeRepository に戻すことで問題は解決します。

5.パッケージがスキャンされていません

それでは、私たちの ShoeRepository を( InventoryRepository と共に) com.baeldung.dependency.exception.repository. という名前の別のパッケージに入れましょう。

繰り返しますが、アプリを実行すると、 UnsatisfiedDependencyException がスローされます。

@SpringBootApplication
@ComponentScan(basePackages = {"com.baeldung.dependency.exception"})
public class SpringDependenciesExampleApplication {
    public static void main(String[]args) {
        SpringApplication.run(SpringDependenciesExampleApplication.class, args);
    }
}

6.非ユニークな依存関係の解決

別の InventoryRepository 実装 - DressRepository を追加するとします。

@Repository
public class DressRepository implements InventoryRepository {
}

それでは、アプリを実行すると、もう一度__UnsatisfiedDependencyExceptionがスローされます。

しかし、今回は状況が異なります。それが起こるので、それを満たす 複数のbeanがあるとき 依存性は解決できません**

これを解決するには、リポジトリを区別するために @ Qualifier を追加します。

@Qualifier("dresses")
@Repository
public class DressRepository implements InventoryRepository {
}
@Qualifier("shoes")
@Repository
public class ShoeRepository implements InventoryRepository {
}

また、 PurchaseDeptService コンストラクタの依存関係に修飾子を追加する必要があります。

public PurchaseDeptService(@Qualifier("dresses") InventoryRepository repository) {
    this.repository = repository;
}

これは DressRepository を唯一の実行可能なオプションにし、Springはそれを__PurchaseDeptServiceに注入します。

7.まとめ

この記事では、 __UnsatisfiedDependencyExceptionが発生する最も一般的なケースをいくつか見てきました。 __また、これらの問題を解決する方法も学びました。

また、https://www.baeldung.com/spring-beancreationexception[Spring BeanCreationException]でより一般的なチュートリアルを見たいと思うかもしれません。

ここに提示されているコードはhttps://github.com/eugenp/tutorials/tree/master/spring-core[GitHubで利用可能]です。