一個客戶was部署的小問題,記錄一下。
問題現象
在我們的服務中用調用別人的webservice服務報錯,框架用的cxf。
報錯關鍵信息有:
E com.ibm.ws.webcontainer.webapp.WebApp logServletError SRVE0293E: [Servlet 錯誤]-[cvm_portal]: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userServiceClient': FactoryBean threw exception on object creation; nested exception is org.apache.cxf.service.factory.ServiceConstructionException
Caused by: java.lang.ClassCastException: com.xxx.xx.userservice.TestInTableToTable$JaxbAccessorF_requestBody incompatible with com.sun.xml.bind.v2.runtime.reflect.Accessor
解決辦法
- 加參數,設置JVM的參數為:-Dcom.ibm.websphere.webservices.DisableIBMJAXWSEngine=true
- 刪除應用中的部分jar包,列表如下:
geronimo-stax-api_1.0_spec-1.0.1.jar
stax-utils-20060502.jar
geronimo-activation_1.1_spec-1.1.jar
jaxb-api-2.2.3.jar
jaxb-impl-2.2.4-1.jar
可以參見 https://stackoverflow.com/questions/31110951/apache-cxf-2-7-11-on-websphere-8-5
注意:
如果你的webservice的客戶端 (或服務端,具體看你充當的是服務端還是客戶端的角色)的類是用java6 編譯的 那么,was 也需要用1.6的JDK,如果用1.8的JDK也會報錯!
如果一定要用1.8 怎么辦?
也有辦法:
用1.8 報錯的信息是:xxxx incompatible with com.sun.xml.internal.bind.v2.runtime.reflect.Accessor
- jaxb-api-2.2.3.jar jaxb-impl-2.2.4-1.jar 放回去,不要刪除。
- 直接點擊步驟導航中你的服務器的名字 返回剛才的 服務器基礎結構/Java SDK 那一頁
點擊Java 和進程管理 展開 點擊 進程定義 點擊右上角 Java 虛擬機
在 通用 JVM 參數 一欄中 加上 -Dcom.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize=true
注意 - 前面有個空格
4. 停掉所有節點,重啟服務(在環境上重啟 不是在控制台 ),然后測試一下
參考 https://stackoverflow.com/questions/15569395/netbeans-with-jaxb-random-classcastexception-cannot-be-cast-to-com-sun-xml-bin/27118756#27118756
