Hi all,

We have a web application which needs to consume an external web service.
To do this we have generated the set of Java artifacts from the WSDL via Maven 
using the wsdl2java goal provided by the cxf-codegen-plugin Maven plugin.  The 
SEI generated by CXF is then used to invoke the web service.
When we deploy the built web app on Tomcat everything works fine.  However, 
when exactly the same web app is deployed on WebSphere Application Server, 
there are problems in terms of the serialized SOAP message that is created.
The SOAP request that is generated by the app deployed on Tomcat is:<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>
The POJO which is marshalled into that SOAP request is:
<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>
The SOAP request generated when the app is deployed on WAS is:
<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>
The POJO which is marshalled into that SOAP request is:
<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>

You can see that the structure of the two requests are different even though 
the code being executed on both servers is exactly the same and the structure 
of the POJOs used to create the SOAP message is the same (barring one value).  
The message produced on Tomcat is the correct one.
If you look at the structure of the <activity> object in each message, you can 
see that in the message produced by on Tomcat, the majority of the data is 
produced as attributes, whereas in the message produced on WAS contains 
everything as actual child nodes of activity.  As per the WSDL and XSD 
definition of the web service interface, the request produced on Tomcat is 
correct.
Our code to generate the correct service endpoint interface implementation is:
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);
        }
    }
I've used the same mechanism to call many other web services before with 
applications deployed on WAS and never had this problem.
Does anyone have any ideas as to what the underlying issue could be?  Or any 
pointers as to where I could investigate further?  I'm at a bit of a dead end 
at the moment and have already spent quite a bit of time investigating the 
issue.
Thanks for your help in advance.
Euan


                                                                                
  

Reply via email to