Saya telah membuat EntityListener ini:

@Slf4j
@Component
public class AListener {

    private final ARepository aRepository;

    public AListener(ARepository aRepository) {
        this.aRepository = aRepository;
    }


    ...
}

Yang saya gunakan di sini:

@Entity
@EntityListeners(AListener.class)
@Table(name = "CAT")
@NoArgsConstructor
@AllArgsConstructor
public class Cat implements Serializable {
..
}

Tapi saya melihat kesalahan ini: Class 'AListener' should have [public] no-arg constructor

Dan di log:

Exception Description: Error encountered when instantiating the class [class com.poli.listener.AListener].
Internal Exception: java.lang.InstantiationException: com.poli.listener.AListener]
1
Nunyet de Can Calçada 23 April 2021, 18:55

1 menjawab

Jawaban Terbaik

EntityListener adalah fitur JPA, bukan fitur Spring. Anda tidak perlu mendeklarasikan listener sebagai @Component, karena penyedia JPA akan membuat instance-nya.

Itulah yang sebenarnya terjadi di sini:

  1. Spring membuat instance kacang AListener dan menyuntikkan dependensi ARepository seperti yang diharapkan.
  2. Penyedia JPA melihat bahwa AListener adalah pendengar entitas dan mencoba untuk membuat instance-nya. Untuk melakukannya diperlukan konstruktor no-args (ingat bahwa penyedia JPA tidak tahu apa-apa tentang Spring dan kacangnya)
  3. Instansiasi gagal, karena konstruktor no-args tidak ditemukan

Anda dapat memeriksanya dengan menghapus dependensi ARepository dan menambahkan beberapa pernyataan logging di dalam konstruktor.

Jika Anda membutuhkan kacang Spring di dalam pendengar, Anda dapat membuatnya dapat diakses sebagai bidang statis di beberapa kelas utilitas.

0
Semyon Kirekov 23 April 2021, 17:44