websphere8.5 与cxf2.x冲突问题

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

解决办法

  1. 加参数,设置JVM的参数为:-Dcom.ibm.websphere.webservices.DisableIBMJAXWSEngine=true
  2. 删除应用中的部分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

  1. jaxb-api-2.2.3.jar jaxb-impl-2.2.4-1.jar 放回去,不要删除。
  2. 直接点击步骤导航中你的服务器的名字 返回刚才的 服务器基础结构/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

原文地址:https://www.cnblogs.com/simoncook/p/8626113.html