[ 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.