Ketergantungan Tidak Puas di Musim Semi

1. Ikhtisar

Dalam tutorial singkat ini, kami akan menjelaskan UnsatisfiedDependencyException Spring , apa penyebabnya, dan cara menghindarinya.

2. Penyebab UnsatisfiedDependencyException

UnsatisfiedDependencyException dilemparkan ketika, seperti namanya, beberapa kacang atau ketergantungan properti tidak terpenuhi.

Ini mungkin terjadi ketika aplikasi Spring mencoba mengirim kacang dan tidak dapat menyelesaikan salah satu dependensi wajib.

3. Contoh Penerapan

Misalkan kita memiliki kelas layanan PurchaseDeptService , yang bergantung pada InventoryRepository:

@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); } } 

Untuk saat ini, kami akan berasumsi bahwa semua kelas ini berada dalam paket yang sama bernama com.baeldung.dependency.exception.app .

Saat kami menjalankan aplikasi Spring Boot ini, semuanya berfungsi dengan baik. Mari kita lihat masalah apa yang dapat kita hadapi jika kita melewatkan langkah konfigurasi.

4. Anotasi Komponen Hilang

Sekarang, mari kita hapus anotasi @Repository dari kelas ShoeRepository kita :

public class ShoeRepository implements InventoryRepository { }

Ketika kita memulai aplikasi kita lagi, kita akan melihat pesan kesalahan berikut: UnsatisfiedDependencyException: Kesalahan membuat kacang dengan nama 'purchaseDeptService': Ketergantungan tidak puas yang diekspresikan melalui parameter konstruktor 0

Spring tidak diinstruksikan untuk mengirim bean ShoeRepository dan menambahkannya ke konteks aplikasi, maka tidak bisa menyuntikkannya dan melemparkan pengecualian.

Menambahkan anotasi @Repository kembali ke ShoeRepository menyelesaikan masalah.

5. Paket Tidak Dipindai

Sekarang mari kita tempatkan ShoeRepository (bersama dengan InventoryRepository ) ke dalam paket terpisah bernama com.baeldung.dependency.exception.repository.

Sekali lagi, ketika kita menjalankan aplikasi kita, itu melontarkan UnsatisfiedDependencyException . Untuk mengatasi ini, kita dapat mengkonfigurasi pemindaian paket pada paket induk dan memastikan bahwa semua kelas yang relevan disertakan:

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

6. Resolusi Ketergantungan Non-unik

Misalkan kita menambahkan implementasi InventoryRepository lain - DressRepository :

@Repository public class DressRepository implements InventoryRepository { } 

Sekarang, ketika kita menjalankan aplikasi kita, itu akan sekali lagi memunculkan UnsatisfiedDependencyException.

Namun, kali ini situasinya berbeda. Ketika itu terjadi, ketergantungan tidak dapat diselesaikan ketika ada lebih dari satu biji yang memenuhi itu .

Untuk mengatasi ini, kami mungkin ingin menambahkan @Qualifier untuk membedakan antara repositori:

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

Selain itu, kita harus menambahkan qualifier ke dependensi konstruktor PurchaseDeptService :

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

Ini akan membuat DressRepository satu-satunya opsi yang layak, dan Spring akan memasukkannya ke PurchaseDeptService.

7. Kesimpulan

Dalam artikel ini, kami telah melihat beberapa kasus paling umum dalam menghadapi UnsatisfiedDependencyException. Juga, kami telah belajar bagaimana memecahkan masalah ini.

Anda mungkin juga ingin melihat tutorial yang lebih umum tentang Spring BeanCreationException.

Kode yang disajikan di sini dapat ditemukan di GitHub.