簡體   English   中英

Apache CXF - 創建動態客戶端時出現 ClassCastException

[英]Apache CXF - ClassCastException on Creating a Dynamic Client

我正在嘗試利用 Apache CXF 庫創建一個動態客戶端,該客戶端將讀取 WSDL 並將其解析為 Java 對象進行處理。

執行此邏輯的應用程序已使用 Spring Boot 2.7 和 JDK11 構建。 JAR 工件在 Spring 引導提供的嵌入式 Tomcat 容器上運行。

JDK11 has removed the JAXB libraries that are necessary to create the objects, but they are being indirectly added from other dependencies specified in the Gradle file (jakarta.xml.bind-api-2.3.3.jar, jaxb-impl-2.3.0.1 .jar 和 jaxb-core-2.3.0.1.jar)。

我正在創建動態客戶端,如下所示。

this.wsdlClient = dcf.createClient(this.serviceURL + "?wsdl");

當我運行客戶端時,應用程序無法編譯從 WSDL 創建的源文件並引發異常。

javax.xml.bind.JAXBException: "report.balance" doesnt contain ObjectFactory.class or jaxb.index

我假設當 CXF 嘗試編譯源文件時,我的應用程序的 JAR 文件中的 JAXB 庫不在類路徑中。 因此,我嘗試創建動態客戶端並使用位於應用程序運行目錄中的文件夾中的所需 JAR 文件指定新的類加載器。

this.wsdlClient = dcf.createClient(this.serviceURL + "?wsdl", new URLClassLoader(new URL[] {
     new File("applibs\\jakarta.xml.bind-api-2.3.3.jar").toURI().toURL(),
     new File("applibs\\jaxb-impl-2.3.0.1.jar").toURI().toURL(),
     new File("applibs\\jaxb-core-2.3.0.1.jar").toURI().toURL(),
     new File("applibs\\javax.activation-api-1.2.0.jar").toURI().toURL()
}));

好消息是從 WSDL 創建的源文件能夠成功編譯!

不幸的是,當動態客戶端檢查 object 實例是否屬於 JAXBContext 類型時,會引發 ClassCastException。

javax.xml.bind.JAXBException: Provider class com.sun.xml.bind.v2.ContextFactory could not be instantiated: javax.xml.bind.JAXBException: ClassCastException: attempting to cast jar:file:/C:/app/applibs/jakarta.xml.bind-api-2.3.3.jar!/javax/xml/bind/JAXBContext.class to jar:file:/C:/app/build/libs/app.jar!/BOOT-INF/lib/jakarta.xml.bind-api-2.3.3.jar!/javax/xml/bind/JAXBContext.class.  Please make sure that you are specifying the proper ClassLoader.

Despite the fact that the JAXBContext class is the same class, I think the presence of two of the jakarta.xml.bind-api JAR files (one in the application JAR and one in the applibs folder) is causing a conflict, but I'我不確定為什么,因為我指定 CXF 使用全新的類加載器來編譯從 WSDL 生成的 Java 源代碼。

我不能從應用程序 JAR 文件中排除 jakarta.xml.bind-api-2.3.3.jar 文件,因為其他依賴項需要它。

我的方法中有什么遺漏嗎?

對於將來遇到此問題的任何人,這是解決方案。

對於動態客戶端的創建,將 Jakarta XML Bind API JAR 包含在傳遞給構造函數的單獨類加載器中。

this.wsdlClient = dcf.createClient(this.serviceURL + "?wsdl", new URLClassLoader(new URL[] {
     new File("applibs\\jakarta.xml.bind-api-2.3.3.jar").toURI().toURL()
}));

In the JAR file, ensure that version 2.3.3 of the JAXB Runtime JAR is included in your application JAR file. 用於添加此依賴項的 Gradle 代碼如下所示。

implementation group: 'org.glassfish.jaxb', name: 'jaxb-runtime', version: '2.3.3'

jaxb-runtime JAR 版本 2.3.6 最初包含在應用程序 JAR 文件中,這導致了上述問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM