You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tuscany.apache.org by "Simon Nash (JIRA)" <de...@tuscany.apache.org> on 2011/04/17 22:08:05 UTC

[jira] [Resolved] (TUSCANY-3779) Tuscany generates incorrect WSDL for @XmlJavaTypeAdapter

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

Simon Nash resolved TUSCANY-3779.
---------------------------------

       Resolution: Fixed
    Fix Version/s: Java-SCA-1.x
         Assignee: Simon Nash

Fixed by the changes for TUSCANY-3298.

> Tuscany generates incorrect WSDL for @XmlJavaTypeAdapter
> --------------------------------------------------------
>
>                 Key: TUSCANY-3779
>                 URL: https://issues.apache.org/jira/browse/TUSCANY-3779
>             Project: Tuscany
>          Issue Type: Bug
>          Components: Java SCA Axis Binding Extension
>    Affects Versions: Java-SCA-1.6
>            Reporter: Simon Nash
>            Assignee: Simon Nash
>             Fix For: Java-SCA-1.x
>
>
> The Tuscany runtime generates incorrect WSDL for a Java datatype that uses the @XmlJavaTypeAdapter annotation.
> For the following Java code (available in itest/jaxws):
> @Remotable
> public interface TestService {
>     void sendAbstract(TestAbstract data);
> }
> @XmlJavaTypeAdapter(TestAdapter.class)
> public abstract class TestAbstract {
>     public String firstName = "?";
>     public String lastName = "??";
>     public String greeting = "???";
>     public String sender = "Anonymous";
>     public String getGreeting() {
>         return greeting;
>     }
> }
> public class TestAdapter extends XmlAdapter<TestAbstractImpl, TestAbstract> {
>     public TestAbstract unmarshal(TestAbstractImpl ai) throws Exception {
>         TestAbstract a = (TestAbstract)this.getClass().getClassLoader().loadClass(ai.className).newInstance();
>         a.sender = ai.someMessage;
>         return a;
>     }
>     public TestAbstractImpl marshal(TestAbstract v) throws Exception {
>         TestAbstractImpl ai = new TestAbstractImpl();
>         ai.className = v.getClass().getName();
>         ai.someMessage = "YouKnowWho";
>         return ai;
>     }
> }
> public class TestAbstractImpl {
>     public String className;
>     public String someMessage;
> }
> the Tuscany runtime generates the following WSDL and schema definitions:
> <?xml version="1.0" encoding="UTF-8"?>
> <wsdl:definitions name="TestServiceService" targetNamespace="http://jtest/" xmlns:tns="http://jtest/"
>       xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xs="http://www.w3.org/2001/XMLSchema"
>       xmlns:SOAP="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:SOAP11="http://schemas.xmlsoap.org/wsdl/soap/">
>   <wsdl:types>
>     <xs:schema attributeFormDefault="qualified" elementFormDefault="unqualified"
>         targetNamespace="http://jtest/" xmlns:tns="http://jtest/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
>       <xs:element name="sendAbstract">
>         <xs:complexType>
>           <xs:sequence>
>             <xs:element minOccurs="0" name="arg0" nillable="true" type="tns:testAbstract"/>
>           </xs:sequence>
>         </xs:complexType>
>       </xs:element>
>       <xs:element name="sendAbstractResponse">
>         <xs:complexType/>
>       </xs:element>
>       <xs:complexType abstract="true" name="testAbstract">
>         <xs:sequence><xs:element minOccurs="0" name="firstName" type="xs:string"/>
>           <xs:element minOccurs="0" name="lastName" type="xs:string"/>
>           <xs:element minOccurs="0" name="greeting" type="xs:string"/>
>           <xs:element minOccurs="0" name="sender" type="xs:string"/>
>         </xs:sequence>
>       </xs:complexType>
>     </xs:schema>
>   </wsdl:types>
>   <wsdl:message name="sendAbstract">
>     <wsdl:part name="sendAbstract" element="tns:sendAbstract">
>     </wsdl:part>
>   </wsdl:message>
>   <wsdl:message name="sendAbstractResponse">
>     <wsdl:part name="sendAbstractResponse" element="tns:sendAbstractResponse">
>     </wsdl:part>
>   </wsdl:message>
>   <wsdl:portType name="TestService">
>     <wsdl:operation name="sendAbstract">
>       <wsdl:input message="tns:sendAbstract">
>     </wsdl:input>
>       <wsdl:output message="tns:sendAbstractResponse">
>     </wsdl:output>
>     </wsdl:operation>
>   </wsdl:portType>
>   <wsdl:binding name="TestServiceBinding" type="tns:TestService">
>     <SOAP:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
>     <wsdl:operation name="sendAbstract">
>       <SOAP:operation/>
>       <wsdl:input>
>         <SOAP:body use="literal"/>
>       </wsdl:input>
>       <wsdl:output>
>         <SOAP:body use="literal"/>
>       </wsdl:output>
>     </wsdl:operation>
>   </wsdl:binding>
>   <wsdl:service name="TestServiceService">
>     <wsdl:port name="TestServicePort" binding="tns:TestServiceBinding">
>       <SOAP:address location="http://localhost:8081/TestService"/>
>     </wsdl:port>
>   </wsdl:service>
> </wsdl:definitions>
> This is incorrect because the service expects the data defined by TestAbstractImpl (className and someMessage) to be passed on the wire, not the data defined by TestAbstract.  Any non-Tuscany client that uses this WSDL generated by Tuscany wouldn't be able to interoperate with the Tuscany service.
> Using JAX-WS to generate WSDL for the same Java code produces correct WSDL, as follows:
> <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
> <!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.1.1 in JDK 6. -->
> <definitions targetNamespace="http://jtest/" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://jtest/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
>   <types>
>     <xsd:schema>
>       <xsd:import namespace="http://jtest/" schemaLocation="TestWebService_schema1.xsd"/>
>     </xsd:schema>
>   </types>
>   <message name="sendAbstract">
>     <part name="parameters" element="tns:sendAbstract"/>
>   </message>
>   <message name="sendAbstractResponse">
>     <part name="parameters" element="tns:sendAbstractResponse"/>
>   </message>
>   <portType name="TestWebService">
>     <operation name="sendAbstract">
>       <input message="tns:sendAbstract"/>
>       <output message="tns:sendAbstractResponse"/>
>     </operation>
>   </portType>
> </definitions>
> <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
> <xs:schema version="1.0" targetNamespace="http://jtest/" xmlns:tns="http://jtest/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
>   <xs:element name="sendAbstract" type="tns:sendAbstract"/>
>   <xs:element name="sendAbstractResponse" type="tns:sendAbstractResponse"/>
>   <xs:complexType name="sendAbstract">
>     <xs:sequence>
>       <xs:element name="arg0" type="tns:testAbstractImpl" minOccurs="0"/>
>     </xs:sequence>
>   </xs:complexType>
>   <xs:complexType name="testAbstractImpl">
>     <xs:sequence>
>       <xs:element name="className" type="xs:string" minOccurs="0"/>
>       <xs:element name="someMessage" type="xs:string" minOccurs="0"/>
>     </xs:sequence>
>   </xs:complexType>
>   <xs:complexType name="sendAbstractResponse">
>     <xs:sequence/>
>   </xs:complexType>
> </xs:schema>

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira