一个客户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