Hi,

Please see my comments inline.

Thanks,
Raymond

--------------------------------------------------
From: "Scott Kurz" <[EMAIL PROTECTED]>
Sent: Wednesday, June 25, 2008 6:34 AM
To: <[email protected]>
Subject: Question about: (TUSCANY-2388) Data binding does not work when Java interface & implementation (where method param is not String, primitive) exposed with a web services binding

This seems like an interesting issue and I was curious about a couple
things:

First, I'm wondering why I didn't recreate the error that others noticed.
Any ideas?

What level of Tuscany code are you using? I'm using the trunk.


Next, I was wondering what implications there are here. I'm not 100% sure
but I'm guessing in the bottom-up case, without the Java wrapper
we would do child-to-child data transform instead of wrapper-to-wrapper (in
spite of the fact that the WSDL we gen is wrapped).

This case is about to have a regular JAX-WS client to talk to the Web Service exposed by Tuscany for a SCA component with a java interface. We now generate wrapper bean classes dynamically during runtime if the wrapper classes are not present.


So does this imply that we always need the Java wrappers to deserialize XML
in the elementFormDefault=qualified style?

If we start from a WSDL operation whose wrapper element has a qualified form, I expect the java interface will be generated from the WSDL and it bears the JAXWS annotations to customize the namespace attr on the @WebParam or @WebResult.


This doesn't seem too burdensome for the user, just trying to understand...

Scott



On Sat, Jun 21, 2008 at 2:03 AM, Raymond Feng (JIRA) <[email protected]>
wrote:


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



Reply via email to