A: Reference -> interface.java -> Databinding(JAXB) -> binding.sca -> binding.sca -> Databinding(JAXB) -> interface.java -> Service -> implementation.java(local)
B: Reference -> interface.java -> Databinding(JAXB) -> binding.sca -> binding.sca -> Databinding(JAXB) -> interface.java -> Service -> implementation.java(@Remotable)
C: Reference -> interface.java -> Databinding(JAXB) -> Databinding(Axiom) -> binding.ws -> binding.ws -> interface.java -> Databindng(Axiom) -> Databinding(JAXB) -> Service -> implementation.java(@Remotable)
C/MTOM: Reference -> interface.java -> Databinding(JAXB) -> Databinding(Axiom) -> binding.ws -> SOAP/MTOM -> binding.ws -> interface.java -> Databindng(Axiom) -> Databinding(JAXB) -> Service -> implementation.java(@Remotable)
D: Reference -> interface.wsdl (doc/lit/wrapped) -> Databinding(JAXB) -> Databinding(Axiom) -> binding.ws -> binding.ws -> interface.wsdl(doc/lit/wrapped) -> Databindng(Axiom) -> Databinding(JAXB) -> Service -> implementation.java(@Remotable)
D/MTOM: Reference -> interface.wsdl (doc/lit/wrapped) -> Databinding(JAXB) -> Databinding(Axiom) -> binding.ws -> SOAP/MTOM -> binding.ws -> interface.wsdl(doc/lit/wrapped) -> Databindng(Axiom) -> Databinding(JAXB) -> Service -> implementation.java(@Remotable)
E: Reference -> interface.java -> Databinding(JAXB) -> Databinding(Axiom) -> binding.ws -> binding.ws -> interface.wsdl(doc/lit/wrapped) -> Databindng(Axiom) -> Databinding(JAXB) -> Service -> implementation.java(@Remotable)
F: Reference -> interface.wsdl(doc/lit/wrapped) -> Databinding(JAXB) -> Databinding(Axiom) -> binding.ws -> binding.ws -> interface.java -> Databindng(Axiom) -> Databinding(JAXB) -> Service -> implementation.java(@Remotable)
G: Reference -> interface.wsdl (doc/lit/bare) -> Databinding(JAXB) -> Databinding(Axiom) -> binding.ws -> binding.ws -> interface.wsdl(doc/lit/bare) -> Databindng(Axiom) -> Databinding(JAXB) -> Service -> implementation.java(@Remotable)
H: Reference -> interface.java -> Databinding(JAXB) -> Databinding(Axiom) -> binding.ws -> binding.ws -> interface.wsdl(doc/lit/bare) -> Databindng(Axiom) -> Databinding(JAXB) -> Service -> implementation.java(@Remotable)
I: Reference -> interface.wsdl(doc/lit/bare) -> Databinding(JAXB) -> Databinding(Axiom) -> binding.ws -> binding.ws -> interface.java -> Databindng(Axiom) -> Databinding(JAXB) -> Service -> implementation.java(@Remotable)
We should look at some binding.ws(portType), binding.ws(binding), binding.ws(port) scenarios also.
Data Type |
A |
B |
C |
C ?wsdl |
C/MTOM |
D |
D/MTOM |
E |
F |
G |
H |
I |
Notes |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
PrimitiveTypes |
|
|
|
|
|
|
|
|
|
|
|
|
|
boolean |
|
|
|
|
|
|
|
|
|
|
|
|
|
byte |
|
|
|
|
|
|
|
|
|
|
|
|
|
short |
|
|
|
|
|
|
|
|
|
|
|
|
|
int |
|
|
|
|
|
|
|
|
|
|
|
|
|
long |
|
|
|
|
|
|
|
|
|
|
|
|
|
float |
|
|
|
|
|
|
|
|
|
|
|
|
|
double |
|
|
|
|
|
|
|
|
|
|
|
|
|
Standard Types |
|
|
|
|
|
|
|
|
|
|
|
|
|
java.lang.String |
|
|
|
|
|
|
|
|
|
|
|
|
|
java.math.BigInteger |
|
|
|
|
|
|
|
|
|
|
|
|
|
java.math.BigDecimal |
|
|
|
|
|
|
|
|
|
|
|
|
|
java.util.Calendar |
|
|
|
|
|
|
|
|
|
|
|
|
|
java.util.Date |
|
|
|
|
|
|
|
|
|
|
|
|
|
javax.xml.namespace.QName |
|
|
|
|
|
|
|
|
|
|
|
|
|
java.net.URI |
|
|
|
|
|
|
|
|
|
|
|
|
|
javax.xml.datatype.XMLGregorianCalendar |
|
|
|
|
|
|
|
|
|
|
|
|
|
javax.xml.datatype.Duration |
|
|
|
|
|
|
|
|
|
|
|
|
|
java.lang.Object |
|
|
|
|
|
|
|
|
|
|
|
|
|
java.awt.Image |
|
|
|
|
|
|
|
|
|
|
|
|
|
javax.activation.DataHandler |
|
|
|
|
|
|
|
|
|
|
|
|
|
javax.xml.transform.Source |
|
|
|
|
|
|
|
|
|
|
|
|
TUSCANY-2387 |
java.util.UUID |
|
|
|
|
|
|
|
|
|
|
|
|
|
Arrays |
|
|
|
|
|
|
|
|
|
|
|
|
|
boolean |
|
|
|
|
|
|
|
|
|
|
|
|
|
byte |
|
|
|
|
|
|
|
|
|
|
|
|
A byte[] must map to xs:base64Binary by default |
short |
|
|
|
|
|
|
|
|
|
|
|
|
|
int |
|
|
|
|
|
|
|
|
|
|
|
|
|
long |
|
|
|
|
|
|
|
|
|
|
|
|
|
float |
|
|
|
|
|
|
|
|
|
|
|
|
|
double |
|
|
|
|
|
|
|
|
|
|
|
|
|
java.lang.String |
|
|
|
|
|
|
|
|
|
|
|
|
|
java.math.BigInteger |
|
|
|
|
|
|
|
|
|
|
|
|
|
java.math.BigDecimal |
|
|
|
|
|
|
|
|
|
|
|
|
|
java.util.Calendar |
|
|
|
|
|
|
|
|
|
|
|
|
|
java.util.Date |
|
|
|
|
|
|
|
|
|
|
|
|
|
javax.xml.namespace.QName |
|
|
|
|
|
|
|
|
|
|
|
|
|
java.net.URI |
|
|
|
|
|
|
|
|
|
|
|
|
|
javax.xml.datatype.XMLGregorianCalendar |
|
|
|
|
|
|
|
|
|
|
|
|
|
javax.xml.datatype.Duration |
|
|
|
|
|
|
|
|
|
|
|
|
|
java.lang.Object |
|
|
|
|
|
|
|
|
|
|
|
|
|
java.awt.Image |
|
|
|
|
|
|
|
|
|
|
|
|
|
javax.activation.DataHandler |
|
|
|
|
|
|
|
|
|
|
|
|
|
javax.xml.transform.Source |
|
|
|
|
|
|
|
|
|
|
|
|
TUSCANY-2386, TUSCANY-2387, TUSCANY-2452 |
java.util.UUID |
|
|
|
|
|
|
|
|
|
|
|
|
|
Collections |
|
|
|
|
|
|
|
|
|
|
|
|
|
List<String>, ArrayList<String> |
|
|
|
|
|
|
|
|
|
|
|
|
|
Map<String, String>, HashMap<String, String> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Polymorphic Types |
|
|
|
|
|
|
|
|
|
|
|
|
|
Case1: Bean3 extends Bean2 |
|
|
|
|
|
|
|
|
|
|
|
|
Unmarshalls to Bean2 always. |
Parameterized Types |
|
|
|
|
|
|
|
|
|
|
|
|
|
TypeExplicit |
|
|
|
|
|
|
|
|
|
|
|
|
|
TypeUnbound |
|
|
|
|
|
|
|
|
|
|
|
|
Unmarshalls to Object[] always. |
TypeExtends |
|
|
|
|
|
|
|
|
|
|
|
|
Unmarshalls to Bean2 always. |
RecursiveTypeBound |
|
|
|
|
|
|
|
|
|
|
|
|
Unmarshalls to Bean1<String> always. |
WildcardUnbound |
|
|
|
|
|
|
|
|
|
|
|
|
|
WildcardSuper |
|
|
|
|
|
|
|
|
|
|
|
|
|
WildcardExtends |
|
|
|
|
|
|
|
|
|
|
|
|
Unmarshalls to Bean2 always. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Variable Arguments |
|
|
|
|
|
|
|
|
|
|
|
|
|
String... |
|
|
|
|
|
|
|
|
|
|
|
|
|
Exceptions |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
The following are note to give more detail of the scenarios and data types.
see http://www.ibm.com/developerworks/webservices/library/ws-whichwsdl/
JAXWS2.1 describes the supported mappings and the restrictions these place on the Java interfaces.
Java
public interface HelloWorldService { public String getGreetings(String firstName, String lastName); } |
WSDL
<wsdl:types> <schema elementFormDefault="qualified" targetNamespace="http://helloworld" xmlns="http://www.w3.org/2001/XMLSchema"> <element name="getGreetings"> <complexType> <sequence> <element name="firstName" type="xsd:string"/> <element name="lastName" type="xsd:string"/> </sequence> </complexType> </element> <element name="getGreetingsResponse"> <complexType> <sequence> <element name="getGreetingsReturn" type="xsd:string"/> </sequence> </complexType> </element> </schema> </wsdl:types> <wsdl:message name="getGreetingsRequest"> <wsdl:part element="tns:getGreetings" name="parameters"/> </wsdl:message> <wsdl:message name="getGreetingsResponse"> <wsdl:part element="tns:getGreetingsResponse" name="parameters"/> </wsdl:message> <wsdl:portType name="HelloWorld"> <wsdl:operation name="getGreetings"> <wsdl:input message="tns:getGreetingsRequest" name="getGreetingsRequest"/> <wsdl:output message="tns:getGreetingsResponse" name="getGreetingsResponse"/> </wsdl:operation> </wsdl:portType> <wsdl:binding name="HelloWorldSoapBinding" type="tns:HelloWorld"> <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="getGreetings"> <wsdlsoap:operation soapAction=""/> <wsdl:input name="getGreetingsRequest"> <wsdlsoap:body use="literal"/> </wsdl:input> <wsdl:output name="getGreetingsResponse"> <wsdlsoap:body use="literal"/> </wsdl:output> </wsdl:operation> </wsdl:binding> |
SOAP
<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/"> <Body> <ns1:getGreetingsxmlns:ns1="http://helloworld"> <ns1:firstName>fred</ns1:firstName> <ns1:secondNameName>bloggs</ns1:secondName> </ns1:getGreetings> </Body> </Envelope> |
There is some support but we need to find the tests
Java
public interface HelloWorldService { public String getGreetings(String firstName, String lastName); } |
WSDL
<wsdl:types> <schema elementFormDefault="qualified" targetNamespace="http://helloworld" xmlns="http://www.w3.org/2001/XMLSchema"> <complexType name="NameType"> <sequence> <element name="firstName" type="xsd:string"/> <element name="lastName" type="xsd:string"/> </sequence> </complexType> <element name="getGreetings" type="tns:NameType"/> <element name="getGreetingsResponse" type="xsd:string"/> </schema> </wsdl:types> <wsdl:message name="getGreetingsRequest"> <wsdl:part element="tns:getGreetings" name="parameters"/> </wsdl:message> <wsdl:message name="getGreetingsResponse"> <wsdl:part element="tns:getGreetingsResponse" name="parameters"/> </wsdl:message> <wsdl:portType name="HelloWorld"> <wsdl:operation name="getGreetings"> <wsdl:input message="tns:getGreetingsRequest" name="getGreetingsRequest"/> <wsdl:output message="tns:getGreetingsResponse" name="getGreetingsResponse"/> </wsdl:operation> </wsdl:portType> <wsdl:binding name="HelloWorldSoapBinding" type="tns:HelloWorld"> <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="getGreetings"> <wsdlsoap:operation soapAction=""/> <wsdl:input name="getGreetingsRequest"> <wsdlsoap:body use="literal"/> </wsdl:input> <wsdl:output name="getGreetingsResponse"> <wsdlsoap:body use="literal"/> </wsdl:output> </wsdl:operation> </wsdl:binding> |
SOAP
Needs checking.
<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/"> <Body> <ns1:getGreetingsxmlns:ns1="http://helloworld"> <ns1:firstName>fred</ns1:firstName> <ns1:secondNameName>bloggs</ns1:secondName> </ns1:getGreetings> </Body> </Envelope> |
We don't support this in Tuscany
We don't support this in Tuscany
Not WS-I compliant
Excluded by SCA
Discussed in JAXWS
There is a JIRA http://issues.apache.org/jira/browse/TUSCANY-2332
What do we need to say about this?
Am assuming as JAXB 2.1 (6)
As JAXB 2.1 (8.5.1)
boolean byte short int long float double |
As JAXB 2.1 (8.5.2)
java.lang.String java.math.BigInteger java.math.BigDecimal java.util.Calendar java.util.Date javax.xml.namespace.QName java.net.URI javax.xml.datatype.XMLGregorianCalendar javax.xml.datatype.Duration java.lang.Object java.awt.Image javax.activation.DataHandler javax.xml.transform.Source java.util.UUID |
As JAXB (8.5.3)
XSD generated using wsgen
class Bean1<T> { T item; } <xs:complexType name="bean1"> <xs:sequence> <xs:element name="item" type="xs:anyType" minOccurs="0"/> </xs:sequence> </xs:complexType> |
class Bean2 { String name } <xs:complexType name="bean2"> <xs:sequence> <xs:element name="name" type="xs:string" minOccurs="0"/> </xs:sequence> </xs:complexType> |
class Bean3 extends Bean2{ String address } |
class Bean4<T extends Bean2> { T aType; } |
class Bean5 extends Bean1<String>{ } |
class Bean6<T extends Bean5<String>> { T aType; } |
Bean1<String> someMethodTypeExplicit(Bean1<String>) |
<xs:complexType name="someMethodTypeExplicit"> <xs:sequence> <xs:element name="arg0" type="tns:bean1" minOccurs="0"/> </xs:sequence> </xs:complexType> <xs:complexType name="someMethodTypeExplicitResponse"> <xs:sequence> <xs:element name="return" type="tns:bean1" minOccurs="0"/> </xs:sequence> </xs:complexType> <xs:element name="someMethodTypeExplicit" type="tns:someMethodTypeExplicit"/> <xs:element name="someMethodTypeExplicitResponse" type="tns:someMethodTypeExplicitResponse"/> <message name="someMethodTypeExplicit"> <part name="parameters" element="tns:someMethodTypeExplicit"/> </message> <message name="someMethodTypeExplicitResponse"> <part name="parameters" element="tns:someMethodTypeExplicitResponse"/> </message> |
<T> Bean1<T> someMethodTypeUnbound(T[] anArray) |
<xs:complexType name="someMethodTypeUnbound"> <xs:sequence> <xs:element name="arg0" type="xs:anyType" nillable="true" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> <xs:complexType name="someMethodTypeUnboundResponse"> <xs:sequence> <xs:element name="return" type="tns:bean1" minOccurs="0"/> </xs:sequence> </xs:complexType> <xs:element name="someMethodTypeUnbound" type="tns:someMethodTypeUnbound"/> <xs:element name="someMethodTypeUnboundResponse" type="tns:someMethodTypeUnboundResponse"/> <message name="someMethodTypeUnbound"> <part name="parameters" element="tns:someMethodTypeUnbound"/> </message> <message name="someMethodTypeUnboundResponse"> <part name="parameters" element="tns:someMethodTypeUnboundResponse"/> </message> |
<T extends Bean2> Bean1<T> someMethodTypeExtends(T[] anArray) |
<xs:complexType name="someMethodTypeExtends"> <xs:sequence> <xs:element name="arg0" type="tns:bean2" nillable="true" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> <xs:complexType name="someMethodTypeExtendsResponse"> <xs:sequence> <xs:element name="return" type="tns:bean1" minOccurs="0"/> </xs:sequence> </xs:complexType> <xs:element name="someMethodTypeExtends" type="tns:someMethodTypeExtends"/> <xs:element name="someMethodTypeExtendsResponse" type="tns:someMethodTypeExtendsResponse"/> <message name="someMethodTypeExtends"> <part name="parameters" element="tns:someMethodTypeExtends"/> </message> <message name="someMethodTypeExtendsResponse"> <part name="parameters" element="tns:someMethodTypeExtendsResponse"/> </message> |
NOT SURE THIS IS VALID <T super Bean3> Bean1<T> someMethodTypeSuper(T[] anArray) |
This is not a valid construct.
<T extends Bean1<String>> Bean1<T> someMethodRecursiveTypeBound(T[] anArray) |
<xs:complexType name="someMethodRecursiveTypeBound"> <xs:sequence> <xs:element name="arg0" type="tns:bean1" nillable="true" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> <xs:complexType name="someMethodRecursiveTypeBoundResponse"> <xs:sequence> <xs:element name="return" type="tns:bean1" minOccurs="0"/> </xs:sequence> </xs:complexType> <xs:element name="someMethodRecursiveTypeBound" type="tns:someMethodRecursiveTypeBound"/> <xs:element name="someMethodRecursiveTypeBoundResponse" type="tns:someMethodRecursiveTypeBoundResponse"/> <message name="someMethodRecursiveTypeBound"> <part name="parameters" element="tns:someMethodRecursiveTypeBound"/> </message> <message name="someMethodRecursiveTypeBoundResponse"> <part name="parameters" element="tns:someMethodRecursiveTypeBoundResponse"/> </message> |
Bean1<?> someMethodWildcardUnbound(Bean1<?>) |
<xs:complexType name="someMethodWildcardUnbound"> <xs:sequence> <xs:element name="arg0" type="tns:bean1" minOccurs="0"/> </xs:sequence> </xs:complexType> <xs:complexType name="someMethodWildcardUnboundResponse"> <xs:sequence> <xs:element name="return" type="tns:bean1" minOccurs="0"/> </xs:sequence> </xs:complexType> <xs:element name="someMethodWildcardUnbound" type="tns:someMethodWildcardUnbound"/> <xs:element name="someMethodWildcardUnboundResponse" type="tns:someMethodWildcardUnboundResponse"/> <message name="someMethodWildcardUnbound"> <part name="parameters" element="tns:someMethodWildcardUnbound"/> </message> <message name="someMethodWildcardUnboundResponse"> <part name="parameters" element="tns:someMethodWildcardUnboundResponse"/> </message> |
Bean1<? super Bean3> someMethodWildcardSuper(Bean1<? super Bean3>) |
<xs:complexType name="someMethodWildcardSuper"> <xs:sequence> <xs:element name="arg0" type="tns:bean1" minOccurs="0"/> </xs:sequence> </xs:complexType> <xs:complexType name="someMethodWildcardSuperResponse"> <xs:sequence> <xs:element name="return" type="tns:bean1" minOccurs="0"/> </xs:sequence> </xs:complexType> <xs:element name="someMethodWildcardSuper" type="tns:someMethodWildcardSuper"/> <xs:element name="someMethodWildcardSuperResponse" type="tns:someMethodWildcardSuperResponse"/> <message name="someMethodWildcardSuper"> <part name="parameters" element="tns:someMethodWildcardSuper"/> </message> <message name="someMethodWildcardSuperResponse"> <part name="parameters" element="tns:someMethodWildcardSuperResponse"/> </message> |
Bean1<? extends Bean2> someMethodWildcardExtends(Bean1<? extends Bean2>) |
<xs:complexType name="someMethodWildcardExtends"> <xs:sequence> <xs:element name="arg0" type="tns:bean1" minOccurs="0"/> </xs:sequence> </xs:complexType> <xs:complexType name="someMethodWildcardExtendsResponse"> <xs:sequence> <xs:element name="return" type="tns:bean1" minOccurs="0"/> </xs:sequence> </xs:complexType> <xs:element name="someMethodWildcardExtends" type="tns:someMethodWildcardExtends"/> <xs:element name="someMethodWildcardExtendsResponse" type="tns:someMethodWildcardExtendsResponse"/> <message name="someMethodWildcardExtends"> <part name="parameters" element="tns:someMethodWildcardExtends"/> </message> <message name="someMethodWildcardExtendsResponse"> <part name="parameters" element="tns:someMethodWildcardExtendsResponse"/> </message> |
As JAXB 2.1 (8.5.4)
HashMap<String, Bean> someMethod(HashMap<String, Bean> aList) |
List<String> someMethod(List<String> aList) |
String[] someMethod (String[], String[]) Bean1[1] someMethod(Bean1[], Bean1[]) |
xsi:type
Case 1:
class Bean2 { } class Bean3 extends Bean2 { } Bean2 someMethod(Bean2) ref.someMethod(Bean3) |
String someMethod(String... params) |
This section describes Tuscany's Java<-->WSDL mapping for business exceptions on remotable interfaces.
Start with a WSDL portType, with a fault message defined in terms of a fault elem and generate the Java from that. If you use a tool like wsimport which you'll get a generated Java exception wrappering a fault in the JAX-WS Sec. 2.5 pattern. That's it. The top-down case is a lot simpler.
<wsdl:types> ... <element name="errorCode" type="xsd:int"/> ... </wsdl:types> <wsdl:message name="BadInputMsg"> <wsdl:part element="tns:errorCode" name="parameters"/> </wsdl:message> <wsdl:portType name="GuessAndGreet"> <wsdl:operation name="sendGuessAndName"> <wsdl:input.../> <wsdl:fault message="tns:BadInputMsg" name="BadInputMsg"/> ... |
Now generate Java (e.g. with wsimport) according to the JAX-WS Section 2.5 pattern:
public Person sendGuessAndName(...) throws BadInputMsg; |
import javax.xml.ws.WebFault; @WebFault(name = "errorCode", targetNamespace = "....") public class BadInputMsg extends Exception { private int faultInfo; public BadInputMsg(String message, int faultInfo) { super(message); this.faultInfo = faultInfo; } public BadInputMsg(String message, int faultInfo, Throwable cause) { super(message, cause); this.faultInfo = faultInfo; } public int getFaultInfo() { return faultInfo; } } |
First, it might be best to avoid designing a remotable interface which throws a technology exception, e.g. java.sql.SQLException. This might be more appropriate for a local interface rather than a coarse-grained remotable interface.
If you have a genuine Java business exception then things get more complicated, at least if your exception wrappers fault data (i.e. it wrappers some data like an error code or object which it needs to pass back to the client catching the exception).
There are two options:
If you are willing/able to modify your Java business exception in this fashion, this is probably the better choice. This exception will be more round-trip friendly as well. That is, if you modify the exception to follow the JAX-WS Sec. 2.5 pattern, run a Java->WSDL (e.g. with wsgen), and then do a later WSDL->Java (e.g. with wsimport), the exception should end up looking pretty similar to the one you just modified.
In practice this means you must do three things:
See above for an example
This assumes, though, that the user is actually reading the documentation in order to know to do this.
This second option will be used in the cases:
In either of those two cases, as long as the exception doesn't contain fault data, this will "just work" without any complexity seen by the user.
For exceptions with fault data, the data will be handled correctly (or not) field by field. For each exception data field with a public getter/setter we will handle the data correctly, and we will lose the data without a getter/setter pair. In other words, we will serialize/deserialize the exception by viewing it as a JavaBean.
Some issues with this second option:
Actually the String message is the fault here and it is handled (serialized/deserialized successfully)
public class RealSimpleException extends Exception { public RealSimpleException(String message) { super(message); } public RealSimpleException(String message, Throwable cause) { super(message, cause); } } |
This works because the String userdata fault has an associated public getter/setter (and the String message is handled as well).
public class TestException extends Exception { private String userdata; public TestException(String message) { super(message); } public TestException(String message, String userdata) { super(message); this.userdata = userdata; } public String getUserdata() { return userdata; } public void setUserdata(String userdata) { this.userdata = userdata; } } |
This does not work because the errorCode fault data does not have a setter. Our runtime is then
not able to figure out how to populate the exception with this piece of fault data. The exception
will still be thrown but WITH DATA LOSS.
package java.sql; public class SQLException extends Exception ... { ... public SQLException(String theReason, String theSQLState, int theErrorCode) ... public int getErrorCode() } |
TODO - Add some details of which bits of tuscany do what w.r.t databindings, mappings and transformations in typical scenarios, e.g.
<component name="HelloWorldClientComponent"> <implementation.java class="helloworld.HelloWorldClientImpl" /> <reference name="helloWorldService"> <interface.wsdl interface="http://helloworld#wsdl.interface(HelloWorld)" /> <binding.ws uri="http://localhost:8085/HelloWorldService"/> </reference> </component> <component name="HelloWorldServiceComponent"> <implementation.java class="helloworld.HelloWorldImpl" /> <service name="HelloWorldService"> <interface.wsdl interface="http://helloworld#wsdl.interface(HelloWorld)" /> <binding.ws uri="http://localhost:8085/HelloWorldService"/> </service> </component> |
Where all the conversions and mapping happen.
<service name="HelloWorldService"> <interface.java ... |
Would lead to a java2wsdl mapping -
1 Specs