Apache CXF的噩梦

时间:2011-08-17 07:35:55

标签: spring cxf xerces

我有一个基于Spring Framework的应用程序,我们之前已成功部署并添加了新功能。我们的开发机器是JDK6和Tomcat7。我们使用的是Spring 3.1.0.M2。旧代码使用Apache CXF 2.4.1提供Web服务并部署到我们的测试服务器上,即Tomcat 5.0和JDK5。

作为新功能的一部分,我使用此春季Web服务客户端定义来访问外部服务

<bean id="urlWebService" class="org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean">
    <property name="serviceInterface" value="au.com.company.app.client.urlservice.UrlWebService" />
    <property name="wsdlDocumentUrl" value="http://dev.urlservice-int.services.company.com.au/v1_0/shortener?wsdl" />
    <property name="namespaceUri" value="http://urlservice.services.company.com.au/shortener" />
    <property name="serviceName" value="GenerateShortenedUrlWebServiceImplService" />
    <property name="portName" value="generateShortenedUrlWebServicePort" />
</bean>

但是现在当我尝试部署到测试服务器上时,我得到了:

Caused by: java.lang.AbstractMethodError: org.apache.xerces.dom.ElementNSImpl.setUserData(Ljava/lang/String;Ljava/lang/Object;Lorg/w3c/dom/UserDataHandler;)Ljava/lang/Object;
    at org.apache.cxf.staxutils.StaxUtils.addLocation(StaxUtils.java:1083)
    at org.apache.cxf.staxutils.StaxUtils.readDocElements(StaxUtils.java:971)
    at org.apache.cxf.staxutils.StaxUtils.readDocElements(StaxUtils.java:947)
    at org.apache.cxf.staxutils.StaxUtils.read(StaxUtils.java:874)
    at org.apache.cxf.wsdl11.WSDLManagerImpl.loadDefinition(WSDLManagerImpl.java:226)
    at org.apache.cxf.wsdl11.WSDLManagerImpl.getDefinition(WSDLManagerImpl.java:186)
    at org.apache.cxf.wsdl11.WSDLServiceFactory.<init>(WSDLServiceFactory.java:92)
    at org.apache.cxf.jaxws.ServiceImpl.initializePorts(ServiceImpl.java:203)
    at org.apache.cxf.jaxws.ServiceImpl.<init>(ServiceImpl.java:147)
    at org.apache.cxf.jaxws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:90)
    at javax.xml.ws.Service.<init>(Service.java:56)
    at javax.xml.ws.Service.create(Service.java:697)
    at org.springframework.remoting.jaxws.LocalJaxWsServiceFactory.createJaxWsService(LocalJaxWsServiceFactory.java:125)
    at org.springframework.remoting.jaxws.JaxWsPortClientInterceptor.prepare(JaxWsPortClientInterceptor.java:334)
    at org.springframework.remoting.jaxws.JaxWsPortClientInterceptor.afterPropertiesSet(JaxWsPortClientInterceptor.java:316)
    at org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean.afterPropertiesSet(JaxWsPortProxyFactoryBean.java:42)

我已经在这两天了,并尝试了所有我可以谷歌和想到的东西。 Tomcat 5.0似乎已在其内存目录中安装了旧版本的Xerces,并且CXF似乎正在尝试使用。

现实是我不希望CXF涉及这个Spring客户端代码。它只是因为我无法删除的遗留代码。我无法想办法让CXF忽略这个客户端。我无法升级服务器和JDK,或删除旧的Xerces。我试图包含更高版本的Xerces以及各种其他XML API,希望CXF能够开始使用其中一个而不是Xerces,我尝试过任何可以找到的配置类型更改。但到目前为止没有任何作用。

有没有人知道如何(a)阻止CXF将它挂钩到这个bean?或者(b)告诉CXF至少不要使用过时的Xerces?

2 个答案:

答案 0 :(得分:5)

您已经通过Tomcat层次结构中的旧Xerces副本强制将Xerces版本降低到CXF的喉咙。你需要在tomcat中升级Xerces - 这就是'认可'的工作方式。

您无法避免在Java 1.5中将CXF用于Web服务客户端。没有内置的JAX-WS替代方案。如果您在1.6中运行,则可以使用内置提供程序。

答案 1 :(得分:0)

尝试将TomEE 1.5.2用于tomcat服务器而不是tomcat 7.0.39,TomEE设置为拥有lib中的所有jar以及您需要的所有内容。