ClassCastException พร้อม Eclipselink DescriptorCustomizer

ฉันได้รับ ClassCastException เมื่อใช้ DescriptorCustomizer ของ Eclipselink สำหรับประวัติ

คลาสเครื่องมือปรับแต่งของฉันดูเหมือนว่า:

public class MyCustomizer implements DescriptorCustomizer {
    @Override
    public void customize(ClassDescriptor classDescriptor) thorws Exception {
        // Setting HistoryPolicy here.
    }
}

เอนทิตีมีคำอธิบายประกอบด้วย:

@Customizer(full.packagename.MyCustomizer.class)

สิ่งนี้ทำในโมดูล EJB ในโครงการ Maven ที่มีโครงสร้างดังนี้:

  • root
    • ear
    • เอเจบี
    • สงคราม

การพึ่งพา Eclipslink คือ:

<dependency>
  <groupId>org.eclipse.persistence</groupId>
  <artifactId>eclipselink</artifactId>
  <version>2.6.3</version>
  <scope>provided</scope>
</dependency>

โค้ดกำลังรันบน WebSphere Liberty 17.0.0.2 ซึ่งไม่มีแอปพลิเคชันอื่นปรับใช้ Eclipselink jar อยู่ในไดเร็กทอรี lib โกลบอลของเซิร์ฟเวอร์

เมื่อ Eclipselink พยายามเข้าถึงเอนทิตีเป็นครั้งแรก ฉันได้รับข้อยกเว้นต่อไปนี้:

MyCustomizer cannot be cast to org.eclipse.persistence.config.DescriptorCustomizer

ฉันพยายามรวม Eclipselink ไว้ในแพ็คเกจของแอปพลิเคชัน แต่ผลลัพธ์ก็เหมือนเดิม อะไรสามารถป้องกันการหล่อที่ถูกต้องได้ และจะแก้ไขได้อย่างไร?

แก้ไข #1

ฉันเปลี่ยนการพึ่งพา eclipselink เป็น:

<dependency>
  <groupId>org.eclipse.persistence</groupId>
  <artifactId>org.eclipse.persistence.core</artifactId>
  <version>2.6.3</version>
  <scope>provided</scope>
</dependency>

เนื่องจากไม่มีแพ็คเกจ javax.persistence ดังนั้นจึงไม่สามารถรบกวนการทำงานภายในของ Websphere ได้

หากฉันกำลังทำการแคสต์แบบแมนนวลในแอปพลิเคชันเพื่อการทดสอบ ก็จะไม่มีข้อยกเว้นเกิดขึ้น ClassCastException ถูกส่งออกไปเมื่อมีการเรียกใช้ getCriteriaBuilder() บน EntityManager


person bdz    schedule 01.11.2017    source แหล่งที่มา


คำตอบ (1)


หลังจากทนทุกข์ทรมานอยู่หลายชั่วโมง ก็มีวิธีแก้ปัญหานี้:

ส่วนการสมัครก็โอเค

ฉันต้องเปลี่ยน server.xml ด้วยวิธีต่อไปนี้: สำหรับ classloader ของแอปพลิเคชัน ฉันต้องผนวก apiTypeVisibility="spec, ibm-api, Third-party" เนื่องจากฉันใช้ไลบรารีที่ระบุ ฉันจึงต้องผนวกตัวระบุนี้ไว้ที่นั่นด้วย

ดังนั้นส่วนที่เกี่ยวข้องของ 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