2011-08-17 164 views
3

我有一個基於Spring框架的應用程序,我們以前已經部署成功並添加了新功能。我們的開發機器是JDK6和Tomcat7。我們使用Spring 3.1.0.M2。舊代碼使用Apache CXF 2.4.1提供Web服務並部署到我們的Tomcat 5.0和JDK5測試服務器上。Apache CXF夢魘

隨着新功能我做這個春天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參與這個春天的客戶端代碼。它只是因爲我無法刪除的遺留代碼。無論如何,我一直無法弄清楚CXF忽視這個客戶的方式。我無法升級服務器和JDK,或者刪除舊的Xerces。我試圖包含更高版本的Xerces以及其他各種各樣的XML API,希望CXF能夠開始使用其中的一個而不是Xerces,並且我嘗試了任何可以找到的配置類型更改。但迄今爲止沒有任何工作。

有沒有人有任何想法如何(一)阻止CXF獲取它掛鉤到這個bean?或(b)告訴CXF至少不使用過期的Xerces?

+2

在Tomcat7/Java6上開發並在Tomcat5/Java5上部署是完全瘋狂的。你在這麼做時遇到重大麻煩。 – skaffman

回答

5

您已經通過Tomcat層次結構中Xerces的舊副本強制該版本的Xerces放棄CXF的喉嚨。您需要升級tomcat中的Xerces - 這就是'認可'的工作方式。

您無法避免在Java 1.5中爲Web服務客戶端使用CXF。沒有內置的JAX-WS選擇。如果您在1.6版本中運行,則可以使用內置提供程序。

0

嘗試使用TomEE 1.5.2而不是tomcat 7.0.39,TomEE設置爲擁有lib中的所有jar和所需的所有內容。