[ 
https://issues.apache.org/jira/browse/TUSCANY-2388?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Peter Kemp updated TUSCANY-2388:
--------------------------------

    Attachment: testcase.zip

Test case to reproduce bug

> Data binding does not work when Java interface & implementation (where method 
> param is not String, primitive) exposed with a web services binding 
> --------------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: TUSCANY-2388
>                 URL: https://issues.apache.org/jira/browse/TUSCANY-2388
>             Project: Tuscany
>          Issue Type: Bug
>          Components: Java SCA Data Binding Runtime
>    Affects Versions: Java-SCA-1.1
>         Environment: Windows XP; IBM J2RE 1.5.0 (Build 2.3)
>            Reporter: Peter Kemp
>         Attachments: testcase.zip
>
>
> 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>

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to