Uploaded image for project: 'Tuscany'
  1. Tuscany
  2. TUSCANY-2388

Data binding does not work when Java interface & implementation (where method param is not String, primitive) exposed with a web services binding

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Resolved
    • Major
    • Resolution: Fixed
    • Java-SCA-1.1, Java-SCA-1.3
    • Java-SCA-1.3, Java-SCA-1.x
    • SCA Java Runtime
    • None
    • Windows XP; IBM J2RE 1.5.0 (Build 2.3)

    Description

      1. Create a component with a java implementation, with a service defined by a Java interface.
      The parameter to the method is not a String, primitive or wrapper - rather, it's a class containing a couple of Strings and an Integer.
      2. Expose the service with a webservice binding.
      3. Deploy the composite (as a WAR or embedded).
      4. Retrieve the WSDL for the service (eg from http://localhost:8080/SomeServices?wsdl).
      5. Generate a web service request from the WSDL.

      The runtime fails to map the web service request message to the implementation class method parameters - it calls the correct method, but the method parameter is null.

      The test works fine when the parameter is a String.

      Composite definition (some.composite):
      -------------------------------------------------------
      <?xml version="1.0" encoding="UTF-8"?>
      <composite xmlns="http://www.osoa.org/xmlns/sca/1.0" targetNamespace="http://test" xmlns:test="http://test" name="some">
      <service name="SomeServices" promote="SomeServicesComponent">
      <binding.ws uri="http://localhost:8080/SomeServices"/>
      </service>

      <component name="SomeServicesComponent">
      <implementation.java class="service.SomeServiceImpl"/>
      <service name="SomeService">
      <interface.java interface="service.SomeService" />
      </service>
      </component>

      </composite>

      Service interface:
      -----------------------
      /**

      • */
        package service;

      import org.osoa.sca.annotations.Remotable;

      @Remotable
      public interface SomeService {

      public AnObject getUsingString(String stringParam);

      public AnObject getUsingMoreComplexObject(MoreComplexObject moreComplexParam);

      }

      Implementation:
      ----------------------
      package service;

      import org.osoa.sca.annotations.Service;

      @Service(SomeService.class)
      public class SomeServiceImpl implements SomeService {

      public AnObject getUsingString(String stringParam)

      { System.out.println("Param value:" + stringParam); return getAnObject(stringParam); }

      private AnObject getAnObject(String stringParam)

      { // TODO Auto-generated method stub return new AnObject(stringParam + "123", 123); }

      public AnObject getUsingMoreComplexObject(MoreComplexObject moreComplexParam)

      { System.out.println("Param value:" + moreComplexParam.getStringParam()); return getAnObject(moreComplexParam.getStringParam()); }

      }

      MoreComplexObject.java
      -----------------------------------
      /**

      • */
        package service;

      import java.io.Serializable;

      public class MoreComplexObject implements Serializable{
      private static final long serialVersionUID = 43242314234123L;
      private String stringParam;
      private Integer intParam;
      private String stringParam2;

      public String getStringParam()

      { return stringParam; }

      public void setStringParam(String stringParam)

      { this.stringParam = stringParam; }

      public Integer getIntParam()

      { return intParam; }

      public void setIntParam(Integer intParam)

      { this.intParam = intParam; }

      public String getStringParam2()

      { return stringParam2; }

      public void setStringParam2(String stringParam2)

      { this.stringParam2 = stringParam2; }

      }

      AnObject.java
      -------------
      package service;

      public class AnObject {

      private String someRetValue;
      private Integer someOtherRetValue;

      public AnObject() {
      }
      public AnObject(String someRetValue, Integer someOtherRetValue)

      { this.someRetValue = someRetValue; this.someOtherRetValue = someOtherRetValue; }

      /**

      • @return the someOtherRetValue
        */
        public Integer getSomeOtherRetValue() { return someOtherRetValue; }

        /**

      • @param someOtherRetValue the someOtherRetValue to set
        */
        public void setSomeOtherRetValue(Integer someOtherRetValue) { this.someOtherRetValue = someOtherRetValue; }

        /**

      • @return the someRetValue
        */
        public String getSomeRetValue() { return someRetValue; }

        /**

      • @param someRetValue the someRetValue to set
        */
        public void setSomeRetValue(String someRetValue) { this.someRetValue = someRetValue; }

      }

      WSDL returned by http://localhost:8080/SomeServices?wsdl
      -------------------------------------------------------------------------------------------
      <?xml version="1.0" encoding="UTF-8"?>
      <wsdl:definitions targetNamespace="http://service" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ns0="http://service/xsd" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:ns1="http://service">
      <wsdl:types>
      <xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://service/xsd" xmlns:ax21="http://service/xsd">
      <xs:complexType name="MoreComplexObject">
      <xs:sequence>
      <xs:element minOccurs="0" name="intParam" nillable="true" type="xs:int"/>
      <xs:element minOccurs="0" name="stringParam" nillable="true" type="xs:string"/>
      <xs:element minOccurs="0" name="stringParam2" nillable="true" type="xs:string"/>
      </xs:sequence>
      </xs:complexType>
      <xs:complexType name="AnObject">
      <xs:sequence>
      <xs:element minOccurs="0" name="someOtherRetValue" nillable="true" type="xs:int"/>
      <xs:element minOccurs="0" name="someRetValue" nillable="true" type="xs:string"/>
      </xs:sequence>
      </xs:complexType>
      </xs:schema>
      <xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://service" xmlns:ns="http://service">
      <xs:element name="getUsingMoreComplexObject">
      <xs:complexType>
      <xs:sequence>
      <xs:element minOccurs="0" name="param0" nillable="true" type="ns0:MoreComplexObject"/>
      </xs:sequence>
      </xs:complexType>
      </xs:element>
      <xs:element name="getUsingMoreComplexObjectResponse">
      <xs:complexType>
      <xs:sequence>
      <xs:element minOccurs="0" name="return" nillable="true" type="ns0:AnObject"/>
      </xs:sequence>
      </xs:complexType>
      </xs:element>
      <xs:element name="getUsingString">
      <xs:complexType>
      <xs:sequence>
      <xs:element minOccurs="0" name="param0" nillable="true" type="xs:string"/>
      </xs:sequence>
      </xs:complexType>
      </xs:element>
      <xs:element name="getUsingStringResponse">
      <xs:complexType>
      <xs:sequence>
      <xs:element minOccurs="0" name="return" nillable="true" type="ns0:AnObject"/>
      </xs:sequence>
      </xs:complexType>
      </xs:element>
      </xs:schema>
      </wsdl:types>
      <wsdl:message name="getUsingStringResponse">
      <wsdl:part name="parameters" element="ns1:getUsingStringResponse">
      </wsdl:part>
      </wsdl:message>
      <wsdl:message name="getUsingMoreComplexObjectResponse">
      <wsdl:part name="parameters" element="ns1:getUsingMoreComplexObjectResponse">
      </wsdl:part>
      </wsdl:message>
      <wsdl:message name="getUsingStringRequest">
      <wsdl:part name="parameters" element="ns1:getUsingString">
      </wsdl:part>
      </wsdl:message>
      <wsdl:message name="getUsingMoreComplexObjectRequest">
      <wsdl:part name="parameters" element="ns1:getUsingMoreComplexObject">
      </wsdl:part>
      </wsdl:message>
      <wsdl:portType name="SomeServicePortType">
      <wsdl:operation name="getUsingString">
      <wsdl:input message="ns1:getUsingStringRequest" wsaw:Action="urn:getUsingString">
      </wsdl:input>
      <wsdl:output message="ns1:getUsingStringResponse" wsaw:Action="urn:getUsingStringResponse">
      </wsdl:output>
      </wsdl:operation>
      <wsdl:operation name="getUsingMoreComplexObject">
      <wsdl:input message="ns1:getUsingMoreComplexObjectRequest" wsaw:Action="urn:getUsingMoreComplexObject">
      </wsdl:input>
      <wsdl:output message="ns1:getUsingMoreComplexObjectResponse" wsaw:Action="urn:getUsingMoreComplexObjectResponse">
      </wsdl:output>
      </wsdl:operation>
      </wsdl:portType>
      <wsdl:binding name="SomeServiceHttpBinding" type="ns1:SomeServicePortType">
      <http:binding verb="POST"/>
      <wsdl:operation name="getUsingString">
      <http:operation location="SomeService/getUsingString"/>
      <wsdl:input>
      <mime:content part="getUsingString" type="text/xml"/>
      </wsdl:input>
      <wsdl:output>
      <mime:content part="getUsingString" type="text/xml"/>
      </wsdl:output>
      </wsdl:operation>
      <wsdl:operation name="getUsingMoreComplexObject">
      <http:operation location="SomeService/getUsingMoreComplexObject"/>
      <wsdl:input>
      <mime:content part="getUsingMoreComplexObject" type="text/xml"/>
      </wsdl:input>
      <wsdl:output>
      <mime:content part="getUsingMoreComplexObject" type="text/xml"/>
      </wsdl:output>
      </wsdl:operation>
      </wsdl:binding>
      <wsdl:binding name="SomeServiceSOAP11Binding" type="ns1:SomeServicePortType">
      <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
      <wsdl:operation name="getUsingString">
      <soap:operation soapAction="urn:getUsingString" style="document"/>
      <wsdl:input>
      <soap:body use="literal"/>
      </wsdl:input>
      <wsdl:output>
      <soap:body use="literal"/>
      </wsdl:output>
      </wsdl:operation>
      <wsdl:operation name="getUsingMoreComplexObject">
      <soap:operation soapAction="urn:getUsingMoreComplexObject" style="document"/>
      <wsdl:input>
      <soap:body use="literal"/>
      </wsdl:input>
      <wsdl:output>
      <soap:body use="literal"/>
      </wsdl:output>
      </wsdl:operation>
      </wsdl:binding>
      <wsdl:binding name="SomeServicePortType__SOAPBinding" type="ns1:SomeServicePortType">
      <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
      <wsdl:operation name="getUsingString">
      <soap:operation soapAction=""/>
      <wsdl:input>
      <soap:body use="literal"/>
      </wsdl:input>
      <wsdl:output>
      <soap:body use="literal"/>
      </wsdl:output>
      </wsdl:operation>
      <wsdl:operation name="getUsingMoreComplexObject">
      <soap:operation soapAction=""/>
      <wsdl:input>
      <soap:body use="literal"/>
      </wsdl:input>
      <wsdl:output>
      <soap:body use="literal"/>
      </wsdl:output>
      </wsdl:operation>
      </wsdl:binding>
      <wsdl:service name="SomeService">
      <wsdl:port name="SomeServiceHttpport" binding="ns1:SomeServiceHttpBinding">
      <http:address location="http://localhost:8080/SomeServices"/>
      </wsdl:port>
      <wsdl:port name="SomeServiceSOAP11port_http" binding="ns1:SomeServiceSOAP11Binding">
      <soap:address location="http://localhost:8080/SomeServices"/>
      </wsdl:port>
      </wsdl:service>
      <wsdl:service name="SomeServicePortType__Service">
      <wsdl:port name="SomeServicePortType_SOAPHTTPPort" binding="ns1:SomeServicePortType_SOAPBinding">
      <soap:address location="http://localhost:8080/SomeServices"/>
      </wsdl:port>
      </wsdl:service>
      </wsdl:definitions>

      SOAP payload:
      --------------------
      <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://service" xmlns:xsd="http://service/xsd">
      <soapenv:Header/>
      <soapenv:Body>
      <ser:getUsingMoreComplexObject>
      <ser:param0>
      <xsd:intParam>12</xsd:intParam>
      <xsd:stringParam>Param_1</xsd:stringParam>
      <xsd:stringParam2>Param2</xsd:stringParam2>
      </ser:param0>
      </ser:getUsingMoreComplexObject>
      </soapenv:Body>
      </soapenv:Envelope>

      Attachments

        1. testcase.zip
          3 kB
          Peter Kemp

        Activity

          People

            rfeng Zhaohui Feng
            pkemp Peter Kemp
            Votes:
            1 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: