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