Saya menerima ClassCastException saat menggunakan DescriptorCustomizer for History Eclipselink.
Kelas penyesuai saya terlihat seperti:
public class MyCustomizer implements DescriptorCustomizer {
@Override
public void customize(ClassDescriptor classDescriptor) thorws Exception {
// Setting HistoryPolicy here.
}
}
Entitas tersebut dianotasi dengan:
@Customizer(full.packagename.MyCustomizer.class)
Hal ini dilakukan dalam modul EJB dalam proyek Maven yang terstruktur seperti:
- root
- ear
- ejb
- perang
Ketergantungan Eclipslink adalah:
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>eclipselink</artifactId>
<version>2.6.3</version>
<scope>provided</scope>
</dependency>
Kode ini berjalan di WebSphere Liberty 17.0.0.2 dan tidak ada aplikasi lain yang diterapkan. Stoples Eclipselink ada di direktori lib global server.
Ketika Eclipselink pertama kali mencoba mengakses entitas saya menerima pengecualian berikut:
MyCustomizer cannot be cast to org.eclipse.persistence.config.DescriptorCustomizer
Saya mencoba memasukkan Eclipselink ke dalam paket aplikasi tetapi hasilnya sama. Apa yang dapat menghalangi casting yang tepat dan bagaimana cara memperbaikinya?
EDIT #1
Saya mengubah ketergantungan Eclipselink menjadi:
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>org.eclipse.persistence.core</artifactId>
<version>2.6.3</version>
<scope>provided</scope>
</dependency>
Karena tidak mengandung paket javax.persistence sehingga tidak mengganggu internal Websphere.
Jika saya melakukan casting manual dalam aplikasi untuk tujuan pengujian maka tidak ada pengecualian. ClassCastException ditampilkan ketika getCriteriaBuilder() dipanggil di EntityManager.