Ketergantungan yang Tidak Puas pada Musim Bunga

1. Gambaran keseluruhan

Dalam tutorial ringkas ini, kami akan menerangkan Spring's UnsatisfiedDependencyException , apa yang menyebabkannya, dan bagaimana untuk mengelakkannya.

2. Punca Pengecualian Tidak Berpuas hati

KetidakpuasanDependencyException dilemparkan apabila, seperti namanya, beberapa ketergantungan kacang atau harta tanah tidak puas.

Ini mungkin berlaku apabila aplikasi Spring cuba memasang kacang dan tidak dapat menyelesaikan salah satu kebergantungan wajib.

3. Contoh Permohonan

Katakan kita mempunyai kelas perkhidmatan 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); } } 

Buat masa ini, kami akan menganggap bahawa semua kelas ini berada dalam pakej yang sama bernama com.baeldung.dependency.exception.app .

Semasa kami menjalankan aplikasi Spring Boot ini, semuanya berjalan lancar. Mari lihat apa jenis masalah yang dapat kita hadapi jika kita melewatkan langkah konfigurasi.

4. Anotasi Komponen Hilang

Sekarang, mari keluarkan anotasi @Repository dari kelas ShoeRepository kami :

public class ShoeRepository implements InventoryRepository { }

Apabila kita memulakan aplikasi kita lagi, kita akan melihat mesej ralat berikut: UnsatisfiedDependencyException: Ralat membuat kacang dengan nama 'pembelianDeptService': Pergantungan yang tidak puas dinyatakan melalui parameter pembina

Spring tidak diperintahkan untuk memasukkan kacang ShoeRepository dan menambahkannya ke konteks aplikasi, oleh itu tidak dapat menyuntiknya dan membuang pengecualian.

Menambah anotasi @Repository kembali ke ShoeRepository menyelesaikan masalah.

5. Pakej Tidak Diimbas

Sekarang mari masukkan ShoeRepository kami (bersama dengan InventoryRepository ) ke dalam pakej berasingan bernama com.baeldung.dependency.exception.repository.

Sekali lagi, ketika kita menjalankan aplikasi kita, ia membuang UnsatisfiedDependencyException . Untuk menyelesaikannya, kami dapat mengkonfigurasi imbasan pakej pada pakej induk dan memastikan bahawa semua kelas yang berkaitan disertakan:

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

6. Penyelesaian Ketergantungan yang tidak unik

Andaikan kita menambah pelaksanaan InventoryRepository - DressRepository :

@Repository public class DressRepository implements InventoryRepository { } 

Sekarang, semasa kita menjalankan aplikasi kita, sekali lagi akan membuang UnsatisfiedDependencyException.

Namun, kali ini keadaannya berbeza. Seperti yang berlaku, kebergantungan tidak dapat diselesaikan ketika ada lebih dari satu biji yang memuaskannya .

Untuk menyelesaikannya, kami mungkin mahu menambahkan @Qualifier untuk membezakan antara repositori:

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

Juga, kita perlu menambahkan kelayakan kebergantungan pembangun PurchaseDeptService :

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

Ini akan menjadikan DressRepository satu-satunya pilihan yang layak, dan Spring akan memasukkannya ke dalam PurchaseDeptService.

7. Kesimpulannya

Dalam artikel ini, kami telah melihat beberapa kes yang paling biasa dalam menghadapi UnsatisfiedDependencyException. Kami juga telah belajar bagaimana menyelesaikan masalah ini.

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

Kod yang disajikan di sini boleh didapati di GitHub.