ClassCastException dengan Eclipselink DescriptorCustomizer

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.


person bdz    schedule 01.11.2017    source sumber


Jawaban (1)


Setelah beberapa jam menderita, ada solusi untuk masalah ini:

Bagian aplikasinya oke.

Saya harus mengubah server.xml dengan cara berikut: untuk classloader aplikasi saya harus menambahkan apiTypeVisibility="spec, ibm-api, third-party". Karena saya menggunakan perpustakaan tertentu, saya harus menambahkan penentu ini di sana juga.

Jadi bagian yang relevan dari server.xml:

<library id="appLibrary" apiTypeVisibility="spec, ibm-api, third-party">
 ...
</library>

<application id="app_ear" ...>
  <classloader commonLibraryRef="appLibrary" apiTypeVisibility="spec, ibm-api, third-parth">
</application>
person bdz    schedule 02.11.2017