[
https://issues.apache.org/jira/browse/TUSCANY-2388?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel]
Raymond Feng resolved TUSCANY-2388.
-----------------------------------
Resolution: Fixed
I confirmed it's now fixed by r670103.
> 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
> Assignee: Raymond Feng
> 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.