Hi,
I believe that we have a tricky bug to fix in Tuscany to deal with plain
POJOs following the JAX-WS/JAXB mapping rules.
For example, there are two classes:
1. j2w.MyData which defines a java bean.
2. j2w.impl.MyInterfaceImpl which is a JAX-WS SEI.
@WebService
public class MyInterfaceImpl implements MyInterface {
@WebMethod
public MyData update(MyData data) {
return null;
}
}
Running "wsgen" tool will produce the XSD for MyData as follows. Please note
the targetNamespace is derived from the package name of MyInterfaceImpl
where the MyData is referenced. This is defined in the JAXB spec 2.1 section
8.7.1.2.
if @XmlType.namespace() is "##default" && @XmlType.name() is "" and class is
not annotated with @XmlRootElement, then the {target namespace} of the
attribute or element to which the property or field, from where this class
is referenced, is mapped.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" targetNamespace="http://impl.j2w/"
xmlns:tns="http://impl.j2w/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="update" type="tns:update"/>
<xs:element name="updateResponse" type="tns:updateResponse"/>
<xs:complexType name="update">
<xs:sequence>
<xs:element name="arg0" type="tns:myData" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="myData">
<xs:sequence/>
</xs:complexType>
<xs:complexType name="updateResponse">
<xs:sequence>
<xs:element name="return" type="tns:myData" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
To implement this rule, Tuscany probably has to find a way to reconcile the
XSDs with empty namespace into WSDL. There are two possible solutions:
1) Tweak the XSD for MyData to be under the target namespace from the SEI
and use "xsd:import" to reference it
2) Have "xsd:include" to directly include the MyData XSD. Since the
MyData.xsd doesn't have a target namespace, it will be added to the document
where the xsd:include element is declared.
Thanks,
Raymond
From: Vincent Zurczak
Sent: Monday, March 30, 2009 9:21 AM
To: [email protected]
Subject: Re: Generating code from WSDL using WSDL2Java
Hi.
The tutorial shows, among other things, how you can reference a web service
in an SCA application, starting from the WSDL only.
I thought that was what you wanted to do. Sorry if I made a mistake. :)
Regarding the WSDL you attached below, it is invalid.
I got the same error with Tuscany 1.4. You can try to validate it with
Eclipse tools, you will see. And this is why you can't use any WSDL2Java
libraries.
There is an empty import and an XML schema with no target namespace.
I think the version 2.0 M1 fix that (but I'm not sure).
The correct WSDL for your service is :
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions name="CalculatorServiceService"
targetNamespace="http://server.tuscany.telvent.com/"
xmlns:tns="http://server.tuscany.telvent.com/"
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://server.tuscany.telvent.com/"
xmlns:xs="http://www.w3.org/2001/XMLSchema"><xs:element
name="multiply"><xs:complexType><xs:sequence><xs:element minOccurs="0"
name="arg0" type="xs:double"/><xs:element minOccurs="0" name="arg1"
type="xs:double"/></xs:sequence></xs:complexType></xs:element><xs:element
name="divide"><xs:complexType><xs:sequence><xs:element minOccurs="0"
name="arg0" type="xs:double"/><xs:element minOccurs="0" name="arg1"
type="xs:double"/></xs:sequence></xs:complexType></xs:element><xs:element
name="add"><xs:complexType><xs:sequence><xs:element minOccurs="0"
name="arg0" type="xs:double"/><xs:element minOccurs="0" name="arg1"
type="xs:double"/></xs:sequence></xs:complexType></xs:element><xs:element
name="divideResponse"><xs:complexType><xs:sequence><xs:element minOccurs="0"
name="return"
type="xs:double"/></xs:sequence></xs:complexType></xs:element><xs:element
name="subtractResponse"><xs:complexType><xs:sequence><xs:element
minOccurs="0" name="return"
type="xs:double"/></xs:sequence></xs:complexType></xs:element><xs:element
name="subtract"><xs:complexType><xs:sequence><xs:element minOccurs="0"
name="arg0" type="xs:double"/><xs:element minOccurs="0" name="arg1"
type="xs:double"/></xs:sequence></xs:complexType></xs:element><xs:element
name="addResponse"><xs:complexType><xs:sequence><xs:element minOccurs="0"
name="return"
type="xs:double"/></xs:sequence></xs:complexType></xs:element><xs:element
name="getPersona"><xs:complexType/></xs:element><xs:element
name="multiplyResponse"><xs:complexType><xs:sequence><xs:element
minOccurs="0" name="return"
type="xs:double"/></xs:sequence></xs:complexType></xs:element><xs:element
name="getPersonaResponse"><xs:complexType><xs:sequence><xs:element
minOccurs="0" name="return" nillable="true"
type="persona"/></xs:sequence></xs:complexType></xs:element>
<xs:complexType name="persona"><xs:sequence><xs:element minOccurs="0"
name="altura" type="xs:int"/><xs:element name="edad"
type="xs:int"/><xs:element minOccurs="0" name="name"
type="xs:string"/></xs:sequence></xs:complexType>
</xs:schema>
</wsdl:types>
<wsdl:message name="multiply">
<wsdl:part name="multiply" element="tns:multiply">
</wsdl:part>
</wsdl:message>
<wsdl:message name="divide">
<wsdl:part name="divide" element="tns:divide">
</wsdl:part>
</wsdl:message>
<wsdl:message name="add">
<wsdl:part name="add" element="tns:add">
</wsdl:part>
</wsdl:message>
<wsdl:message name="divideResponse">
<wsdl:part name="divideResponse" element="tns:divideResponse">
</wsdl:part>
</wsdl:message>
<wsdl:message name="subtractResponse">
<wsdl:part name="subtractResponse" element="tns:subtractResponse">
</wsdl:part>
</wsdl:message>
<wsdl:message name="subtract">
<wsdl:part name="subtract" element="tns:subtract">
</wsdl:part>
</wsdl:message>
<wsdl:message name="addResponse">
<wsdl:part name="addResponse" element="tns:addResponse">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getPersona">
<wsdl:part name="getPersona" element="tns:getPersona">
</wsdl:part>
</wsdl:message>
<wsdl:message name="multiplyResponse">
<wsdl:part name="multiplyResponse" element="tns:multiplyResponse">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getPersonaResponse">
<wsdl:part name="getPersonaResponse" element="tns:getPersonaResponse">
</wsdl:part>
</wsdl:message>
<wsdl:portType name="CalculatorService">
<wsdl:operation name="getPersona">
<wsdl:input message="tns:getPersona">
</wsdl:input>
<wsdl:output message="tns:getPersonaResponse">
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="add">
<wsdl:input message="tns:add">
</wsdl:input>
<wsdl:output message="tns:addResponse">
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="subtract">
<wsdl:input message="tns:subtract">
</wsdl:input>
<wsdl:output message="tns:subtractResponse">
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="divide">
<wsdl:input message="tns:divide">
</wsdl:input>
<wsdl:output message="tns:divideResponse">
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="multiply">
<wsdl:input message="tns:multiply">
</wsdl:input>
<wsdl:output message="tns:multiplyResponse">
</wsdl:output>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="CalculatorServiceBinding"
type="tns:CalculatorService">
<SOAP:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="getPersona">
<SOAP:operation/>
<wsdl:input>
<SOAP:body use="literal"/>
</wsdl:input>
<wsdl:output>
<SOAP:body use="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="add">
<SOAP:operation/>
<wsdl:input>
<SOAP:body use="literal"/>
</wsdl:input>
<wsdl:output>
<SOAP:body use="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="subtract">
<SOAP:operation/>
<wsdl:input>
<SOAP:body use="literal"/>
</wsdl:input>
<wsdl:output>
<SOAP:body use="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="divide">
<SOAP:operation/>
<wsdl:input>
<SOAP:body use="literal"/>
</wsdl:input>
<wsdl:output>
<SOAP:body use="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="multiply">
<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="CalculatorServiceService">
<wsdl:port name="CalculatorServicePort"
binding="tns:CalculatorServiceBinding">
<SOAP:address
location="http://192.168.3.15:8085/CalculatorServiceComponent"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
And it then should work.
Regards,
Vincent.
[email protected] a écrit :
Hi.
Tutorial is very interesting but I can not find the specific example for my
problem. I want to develop a client that connects with the SCA Calculator.
The example from
http://wiki.eclipse.org/images/7/72/EclipseCON_2009_SOA_Tutorial_Toward---SCA.pdf
connects using a RMI binding. This client needs to know the interface from
the service that it will be consumed (GlobalWeatherService). It needs the
same java code in the client side.
I want an independent client that didn't know java code from SCA Calculator.
You can imagine that I haven't developed the SCA Calculator but WSDL
contract is published in internet.
I only knew the WSDL contract generated by Tuscany. But the problem is that
I have an error when I am using WSDL2Java. Person class can not be found.
Thank you very much
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions name="CalculatorServiceService"
targetNamespace="http://server.tuscany.telvent.com/"
xmlns:tns="http://server.tuscany.telvent.com/"
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 version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="persona"><xs:sequence><xs:element minOccurs="0"
name="altura" type="xs:int"/><xs:element name="edad"
type="xs:int"/><xs:element minOccurs="0" name="name"
type="xs:string"/></xs:sequence></xs:complexType>
</xs:schema>
<xs:schema attributeFormDefault="qualified"
elementFormDefault="unqualified"
targetNamespace="http://server.tuscany.telvent.com/"
xmlns:xs="http://www.w3.org/2001/XMLSchema"><xs:import/><xs:element
name="multiply"><xs:complexType><xs:sequence><xs:element minOccurs="0"
name="arg0" type="xs:double"/><xs:element minOccurs="0" name="arg1"
type="xs:double"/></xs:sequence></xs:complexType></xs:element><xs:element
name="divide"><xs:complexType><xs:sequence><xs:element minOccurs="0"
name="arg0" type="xs:double"/><xs:element minOccurs="0" name="arg1"
type="xs:double"/></xs:sequence></xs:complexType></xs:element><xs:element
name="add"><xs:complexType><xs:sequence><xs:element minOccurs="0"
name="arg0" type="xs:double"/><xs:element minOccurs="0" name="arg1"
type="xs:double"/></xs:sequence></xs:complexType></xs:element><xs:element
name="divideResponse"><xs:complexType><xs:sequence><xs:element minOccurs="0"
name="return"
type="xs:double"/></xs:sequence></xs:complexType></xs:element><xs:element
name="subtractResponse"><xs:complexType><xs:sequence><xs:element
minOccurs="0" name="return"
type="xs:double"/></xs:sequence></xs:complexType></xs:element><xs:element
name="subtract"><xs:complexType><xs:sequence><xs:element minOccurs="0"
name="arg0" type="xs:double"/><xs:element minOccurs="0" name="arg1"
type="xs:double"/></xs:sequence></xs:complexType></xs:element><xs:element
name="addResponse"><xs:complexType><xs:sequence><xs:element minOccurs="0"
name="return"
type="xs:double"/></xs:sequence></xs:complexType></xs:element><xs:element
name="getPersona"><xs:complexType/></xs:element><xs:element
name="multiplyResponse"><xs:complexType><xs:sequence><xs:element
minOccurs="0" name="return"
type="xs:double"/></xs:sequence></xs:complexType></xs:element><xs:element
name="getPersonaResponse"><xs:complexType><xs:sequence><xs:element
minOccurs="0" name="return" nillable="true"
type="persona"/></xs:sequence></xs:complexType></xs:element></xs:schema>
</wsdl:types>
<wsdl:message name="multiply">
<wsdl:part name="multiply" element="tns:multiply">
</wsdl:part>
</wsdl:message>
<wsdl:message name="divide">
<wsdl:part name="divide" element="tns:divide">
</wsdl:part>
</wsdl:message>
<wsdl:message name="add">
<wsdl:part name="add" element="tns:add">
</wsdl:part>
</wsdl:message>
<wsdl:message name="divideResponse">
<wsdl:part name="divideResponse" element="tns:divideResponse">
</wsdl:part>
</wsdl:message>
<wsdl:message name="subtractResponse">
<wsdl:part name="subtractResponse" element="tns:subtractResponse">
</wsdl:part>
</wsdl:message>
<wsdl:message name="subtract">
<wsdl:part name="subtract" element="tns:subtract">
</wsdl:part>
</wsdl:message>
<wsdl:message name="addResponse">
<wsdl:part name="addResponse" element="tns:addResponse">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getPersona">
<wsdl:part name="getPersona" element="tns:getPersona">
</wsdl:part>
</wsdl:message>
<wsdl:message name="multiplyResponse">
<wsdl:part name="multiplyResponse" element="tns:multiplyResponse">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getPersonaResponse">
<wsdl:part name="getPersonaResponse" element="tns:getPersonaResponse">
</wsdl:part>
</wsdl:message>
<wsdl:portType name="CalculatorService">
<wsdl:operation name="getPersona">
<wsdl:input message="tns:getPersona">
</wsdl:input>
<wsdl:output message="tns:getPersonaResponse">
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="add">
<wsdl:input message="tns:add">
</wsdl:input>
<wsdl:output message="tns:addResponse">
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="subtract">
<wsdl:input message="tns:subtract">
</wsdl:input>
<wsdl:output message="tns:subtractResponse">
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="divide">
<wsdl:input message="tns:divide">
</wsdl:input>
<wsdl:output message="tns:divideResponse">
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="multiply">
<wsdl:input message="tns:multiply">
</wsdl:input>
<wsdl:output message="tns:multiplyResponse">
</wsdl:output>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="CalculatorServiceBinding"
type="tns:CalculatorService">
<SOAP:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="getPersona">
<SOAP:operation/>
<wsdl:input>
<SOAP:body use="literal"/>
</wsdl:input>
<wsdl:output>
<SOAP:body use="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="add">
<SOAP:operation/>
<wsdl:input>
<SOAP:body use="literal"/>
</wsdl:input>
<wsdl:output>
<SOAP:body use="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="subtract">
<SOAP:operation/>
<wsdl:input>
<SOAP:body use="literal"/>
</wsdl:input>
<wsdl:output>
<SOAP:body use="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="divide">
<SOAP:operation/>
<wsdl:input>
<SOAP:body use="literal"/>
</wsdl:input>
<wsdl:output>
<SOAP:body use="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="multiply">
<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="CalculatorServiceService">
<wsdl:port name="CalculatorServicePort"
binding="tns:CalculatorServiceBinding">
<SOAP:address
location="http://192.168.3.15:8085/CalculatorServiceComponent"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
Un saludo.
Santiago Miguel Aranda Rojas
Telvent Interactiva
Extension: 35999
Vincent Zurczak <[email protected]>
Vincent Zurczak
30/03/2009 15:44
Por favor, responda a user
Para: [email protected]
cc:
Asunto: Re: Generating code from WSDL using WSDL2Java
Hi.
The Eclipse SCA Tools provide some features to allow you to simply call a
web service in an SCA application.
It does not work with specific message structures, but your case seems
pretty simple and it should work without any problem.
Basically, it generates you a WS client and then cleans up the code to
remove all the unrequired elements.
This approach has already been tested with Tuscany 1.4 and it was even part
of the SOA tutorial that was presented last week at EclipseCON.
You can find an example on the SCA Tools wiki [0].
The tutorial itself is available here [1]. Check the pages 9 and 10 in
particular.
It shows in details how you can call a web service from an SCA application
in few clicks (no need to create another SCA application).
There will be another tutorial soon on the STP wiki, to show how you can use
JAX-B for more complex referenced web services.
Regards,
Vincent Zurczak.
[0] : http://wiki.eclipse.org/STP/SCA_Component
[1] :
http://wiki.eclipse.org/images/7/72/EclipseCON_2009_SOA_Tutorial_Toward---SCA.pdf
[email protected] a écrit :
I have running Calculator sample included in apache-tuscany-sca-all-2.0-M1.
I have added a new component to this composite service. This is called
GetPersonaService. It only has a method "getPersona" that returns an object
"Person". It is a complex type with three attributes , age, name, height. I
am publishing this component with my CalculatorService like Web Service.
<component name="CalculatorServiceComponent">
<implementation.java
class="com.telvent.tuscany.server.CalculatorServiceImpl"/>
<service name="CalculatorService">
<binding.ws
uri="http://localhost:8085/CalculatorServiceComponent"/>
</service>
<reference name="getPersonaService"
target="GetPersonaServiceComponent"/>
</component>
<component name="GetPersonaServiceComponent">
<implementation.java
class="com.telvent.tuscany.server.GetPersonaServiceImpl"/>
</component>
...
I have done another little SCA application that is connecting to Web Service
and using its funcionality. It works. I mean I can access to "getPersona"
method through its WebService. Problem is client application need to know
Persona class. It is necessary to have a copy of "Person.java" in the new
bundle.
<component name="CalculatorClient">
<implementation.java
class="com.telvent.tuscany.server.CalculatorClient"/>
<reference name="calculatorService">
<binding.ws
uri="http://localhost:8085/CalculatorServiceComponent"/>
</reference>
</component>
But I want to connect to the Web service using a little client application
that is not SCA. I mean it haven´t developed using Tuscany. I followed this
Steps.
* I ran SCA CalculatorService.
* I stored generated WSDL .
* I am trying generate client code using WSDL2Java but I obtain this
error --> org.apache.axis2.SchemaCompiler findClassName. Type persona
missing!
When I run this client (with this autogenerated code) I can acess to methods
that return primitive types values (int, double... add method for example).
But the getPersona method that return a complex type Person is not working.
I have seen that autogenerated code does not contain code for recovering of
age, name, height attributes.
What can I do?
Thanks in advance
Un saludo.
Santiago Miguel Aranda Rojas
Telvent Interactiva
Extension: 35999
--
Vincent Zurczak
EBM WebSourcing
+33 (0) 4 38 12 16 77