2013-09-30 116 views
3

我們有一個需要使用外部Web服務的應用程序。爲此,我們使用cxf-codegen-plugin插件提供的wsdl2java目標,通過Maven從WSDL生成一組Java工件。JAXWS - 生成SOAP消息正確結構的問題

我們已經編寫了一個集成測試,作爲我們的測試套件的一部分,它調用真正的Web服務,並且一切正常。

然後將與實際Web服務集成的代碼打包到一組JAR中,並在需要使用Web服務的前端應用程序內部使用。

當FE應用程序使用集成代碼時,我們遇到問題。 FE應用程序正在執行與我們的工作集成測試中使用的完全相同的代碼,但最終生成的SOAP消息在兩者之間不同,實際應用程序生成的消息不正確。

由我們的集成測試中產生的工作SOAP請求是:

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> 
    <S:Body> 
    <ns12:ProcessUIRequest xmlns:ns10="http://zzz/yyyentityview/validation/" 
    xmlns:ns11="http://zzz/yyyview/search/list/" 
    xmlns:ns12="http://zzz/yyywebservice/v5/types/" 
    xmlns:ns2="http://zzz/yyyentityview/app/" 
    xmlns:ns3="http://zzz/yyyentityview/client/" 
    xmlns:ns4="http://zzz/yyyview/search/postcode/" 
    xmlns:ns5="http://zzz/yyyview/app/" 
    xmlns:ns6="http://zzz/yyyview/search/app/" 
    xmlns:ns7="http://zzz/yyyview/search/bank/" 
    xmlns:ns8="http://zzz/yyyview/uw/" 
    xmlns:ns9="http://zzz/yyybase/"> 
     <ns12:ProcessUIRequest CallType="Submit" DisplayError="false" 
     IsAnonymous="false" IsCompactRequest="false" IsError="false"> 
     <ns9:ModelData> 
      <ns9:TransactionData ApplicationReference="20000003CR3.00000003" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:type="ns5:QuoteLoadTxnDataVO" /> 
     </ns9:ModelData> 
     <ns9:Activity ActionCode="QuoteLoad" ActionMode="Default" 
     ActivityCode="QuoteApplicationFull" ActivityMode="Default" 
     ActivityReference="" ActivityStatus="Inital" 
     ActivityTransaction="StartNewActivityAndLogOffUser" 
     CanProceedWithValidationsOutstanding="true"> 
      <ns9:BusinessKeys> 
      <item> 
       <key> 
       <string>ADVREF</string> 
       </key> 
       <value> 
       <BusinessKeyVO KeyName="ADVREF" KeyValue="AVAGT01"> 
        <BusinessKey KeyName="ADVREF" KeyType="Unknown" 
        KeyValue="AVAGT01" /> 
       </BusinessKeyVO> 
       </value> 
      </item> 
      </ns9:BusinessKeys> 
     </ns9:Activity> 
     </ns12:ProcessUIRequest> 
    </ns12:ProcessUIRequest> 
    </S:Body> 
</S:Envelope> 

被編組到該SOAP請求的POJO是:

<tcp.ssgbase.BaseVO> 
    <modelData> 
    <transactionData class="tcp.ssgview.app.QuoteLoadTxnDataVO"> 
     <applicationReference>20000003CR3.00000003</applicationReference> 
    </transactionData> 
    </modelData> 
    <activity> 
    <businessKeys> 
     <item> 
     <tcp.serializable__dictionary.BusinessKeyItem> 
      <key> 
      <string>ADVREF</string> 
      </key> 
      <value> 
      <businessKeyVO> 
       <businessKey> 
       <keyName>ADVREF</keyName> 
       <keyValue>AVAGT01</keyValue> 
       <keyType>Unknown</keyType> 
       </businessKey> 
       <keyName>ADVREF</keyName> 
       <keyValue>AVAGT01</keyValue> 
      </businessKeyVO> 
      </value> 
     </tcp.serializable__dictionary.BusinessKeyItem> 
     </item> 
    </businessKeys> 
    <actionMode>DEFAULT</actionMode> 
    <activityMode>DEFAULT</activityMode> 
    <activityTransaction>START_NEW_ACTIVITY_AND_LOG_OFF_USER</activityTransaction> 
    <actionCode>QuoteLoad</actionCode> 
    <activityReference></activityReference> 
    <activityStatus>INITAL</activityStatus> 
    <activityCode>QuoteApplicationFull</activityCode> 
    <canProceedWithValidationsOutstanding>true</canProceedWithValidationsOutstanding> 
    </activity> 
    <displayError>false</displayError> 
    <isAnonymous>false</isAnonymous> 
    <isError>false</isError> 
    <isCompactRequest>false</isCompactRequest> 
    <callType>SUBMIT</callType> 
</tcp.ssgbase.BaseVO> 

由實際FE應用生成的SOAP請求是:

<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"> 
    <soapenv:Body> 
    <ns2:ProcessUIRequest xmlns:ns2="http://zzz/yyywebservice/v5/types/"> 
     <processUIRequest> 
     <activity> 
      <actionCode>QuoteLoad</actionCode> 
      <actionMode>DEFAULT</actionMode> 
      <activityCode>QuoteApplicationFull</activityCode> 
      <activityMode>DEFAULT</activityMode> 
      <activityReference /> 
      <activityStatus>INITAL</activityStatus> 
      <activityTransaction> 
      START_NEW_ACTIVITY_AND_LOG_OFF_USER</activityTransaction> 
      <businessKeys /> 
      <canProceedWithValidationsOutstanding> 
      true</canProceedWithValidationsOutstanding> 
     </activity> 
     <callType>SUBMIT</callType> 
     <displayError>false</displayError> 
     <isAnonymous>false</isAnonymous> 
     <isCompactRequest>false</isCompactRequest> 
     <isError>false</isError> 
     <modelData> 
      <transactionData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:type="ns2:quoteLoadTxnDataVO"> 
      <applicationReference> 
      20000003ESF.00000018</applicationReference> 
      </transactionData> 
     </modelData> 
     </processUIRequest> 
    </ns2:ProcessUIRequest> 
    </soapenv:Body> 
</soapenv:Envelope> 

被整理到該SOAP請求中的POJO t是:

<tcp.ssgbase.BaseVO> 
    <modelData> 
    <transactionData class="tcp.ssgview.app.QuoteLoadTxnDataVO"> 
     <applicationReference>20000003ESF.00000018</applicationReference> 
    </transactionData> 
    </modelData> 
    <activity> 
    <businessKeys> 
     <item> 
     <tcp.serializable__dictionary.BusinessKeyItem> 
      <key> 
      <string>ADVREF</string> 
      </key> 
      <value> 
      <businessKeyVO> 
       <businessKey> 
       <keyName>ADVREF</keyName> 
       <keyValue>AVAGT01</keyValue> 
       <keyType>Unknown</keyType> 
       </businessKey> 
       <keyName>ADVREF</keyName> 
       <keyValue>AVAGT01</keyValue> 
      </businessKeyVO> 
      </value> 
     </tcp.serializable__dictionary.BusinessKeyItem> 
     </item> 
    </businessKeys> 
    <actionMode>DEFAULT</actionMode> 
    <activityMode>DEFAULT</activityMode> 
    <activityTransaction>START_NEW_ACTIVITY_AND_LOG_OFF_USER</activityTransaction> 
    <actionCode>QuoteLoad</actionCode> 
    <activityReference></activityReference> 
    <activityStatus>INITAL</activityStatus> 
    <activityCode>QuoteApplicationFull</activityCode> 
    <canProceedWithValidationsOutstanding>true</canProceedWithValidationsOutstanding> 
    </activity> 
    <displayError>false</displayError> 
    <isAnonymous>false</isAnonymous> 
    <isError>false</isError> 
    <isCompactRequest>false</isCompactRequest> 
    <callType>SUBMIT</callType> 
</tcp.ssgbase.BaseVO> 

你可以看到,即使代碼在我們的集成JAR文件正在執行的兩個請求的結構是不同的是完全一樣的,並用於創建SOAP消息的POJO的結構是相同(禁止一個值)。從請求中,它看起來像FE應用程序中生成的請求沒有選擇正確的WSDL和關聯的XSD。

我們的代碼生成正確的服務端點接口的實現是:

private <T> T createServiceObject(final Class<T> p_seiClass) throws ApplicationException { 
     try { 
      final Service serviceFactory = Service.create(new URL(wsdlLocation), new QName(targetNamespace, serviceName)); 

      final SoapHandlerResolver handlerResolver = new SoapHandlerResolver(); 
      handlerResolver.addHandler(new SoapMessageLoggingHandler()); 
      serviceFactory.setHandlerResolver(handlerResolver); 

      final T service = serviceFactory.getPort(p_seiClass); 
      ((BindingProvider) service).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, 
       "endpoint"); 

      return service; 
     } catch (MalformedURLException e) { 
      throw new ApplicationException(ApplicationErrorCode.COMM_ERR_UNEXPECTED_ERROR, e); 
     } 
    } 

做一些調試後,我已經注意到,服務工廠的實例是在集成測試不同,當我們內運行FE應用程序。

在集成測試中,類的實例(取自Eclipse調試器,我們使用jUnit運行集成測試)是:'JDK 6中的JAX-WS RI 2.1.6:Stub for',它似乎屬於'SEIStub'類型。

在FE應用程序中運行時,該類的實例是org.apache.axis2.jaxws.client.proxy.JAXWSProxyHandler。 FE應用程序在WebSphere Application Server上託管和執行。

所以,我的問題是,在實際的FE應用程序中運行時,如果將POJO編組爲SOAP請求時會導致錯誤的WSDL和XSD定義,可能會發生什麼情況?我花了很長時間試圖調試,但無濟於事。

+0

這兩個soap請求是不同的,因爲**正如你已經說過的那樣**,兩個serviceFactory是不同的並且使用不同的規範1.1和1.2)。我的建議是,你配置你的Maven項目來導入正確的罐子或更新容器上的jar(該jar創建serviceFactory)。由於我不熟悉'cxf-codegen-plugin',我不能提出更多的建議。 –

+1

@JorgeCampos是的,你確實是對的。我改變了我們的應用程序,以便使用CXF JAXWS運行時而不是缺省情況下使用的Axis2 JAXWS運行時,並且問題已得到解決。 我對我爲什麼看到原始錯誤感興趣,因爲我們已經使用完全相同的模式(CXF生成客戶端工件,然後在WAS上使用Axis2 JAXWS運行時)與其他許多Web服務集成,並且從未有任何這樣的問題。 如果你想添加你的評論作爲答案,我會接受它。 – chrishern

回答

1

兩個SOAP請求是不同的,因爲,因爲你已經說,兩個serviceFactory的不同而使用不同規格1.11.2

我的建議是,你可以配置你的maven項目,在你的測試環境中導入正確的jar或更新容器上的jar(創建serviceFactory的jar)。由於我不熟悉cxf-codegen-plugin,所以我不能提出更多的建議。

此建議最初發布爲評論。 OP要求將其作爲答案。

1

我在嘗試編寫客戶端應用程序並將其部署到WebLogic Server時遇到過這種情況。您需要使用服務器在創建類時使用的java的確切版本。 Soap請求由JVM在內部創建。如果在創建類並測試它們並在實時使用它們的同時JVM不同,那麼SOAP將會或可能會不同。

相關問題