We use JAXB internally to support POJO for WS/XML. The POJOs are mapped
to/from XML following the JAXB rules. If you have an external WSDL/XSD, you
are recommended to use wsimport tool to generate the Java interface which
accurately represents the WSDL/XSD. Please see an example at:
https://svn.apache.org/repos/asf/tuscany/branches/sca-java-1.x/samples/zipcode-jaxws/
(We actually use the same WS as you do :-).
Of course you can still handcraft the POJOs, but you might have to add a few
JAXB annotations to map the namespaces. To unmarshal the XML into JAXB/POJO,
if a property is not found, it is ignored. That's why you see the empty
data.
Thanks,
Raymond
--------------------------------------------------
From: "Martin Thoma" <[email protected]>
Sent: Friday, June 05, 2009 4:42 AM
To: <[email protected]>
Subject: using webservices transparent
Hello,
I am trying to integrate an external web service(represented by WSDL) in a
SCA component within the Tuscany platform (Version 1.3.1). The web
services is specified as reference in the component composite, as well as
annotated in implementation code(see below). The example that I
implemented was similar to the xml-bigbank example in the tuscany 1.3.1
version. With the examples (see code below), I got different results. But
I want to use a transplant solution provided by the tuscany framework,
where I don't have to use generated stub code(e.g. from axis2 wsdl2java)
in the implementation(client) code.
As a first step I developed a external test webservice operated on axis2
server(outside the tuscany framework).
To use this web service in the tuscany platform, I declared this
interface, which represents external web service(inside tuscany
framework):
@Remotable
public interface TestService{
Result foo(Request r);
}
with Result and Request as normal POJO classes.
The binding in client.composite:
<reference name="testService">
<binding.ws
wsdlElement="http://targetnamespace/#wsdl.port(TestService/TestServiceSoap)"
/>
</reference>
the corresponding wsdl
<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions targetNamespace="http://targetnamespace/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<wsdl:import namespace="http://targetnamespace/"
location="http://localhost/testservice?wsdl" />
</wsdl:definitions>
the TestClient (implementation of remotable interface):
@Reference
protected TestService testService;
...
Request r = new Request();
Result rs = testService.foo(r);
and everything works fine (no axis,axis2, etc. stuff in client code) ;-)
Now I tried to integrate a foreign external webservice
(URI: http://www.webservicex.net/WeatherForecast.asmx?wsdl):
The interface:
@Remotable
public interface WeatherService {
GetWeatherByPlaceNameResult GetWeatherByPlaceName(String placeName)
throws java.rmi.RemoteException;
}
and again with GetWeatherByPlaceNameResult as POJO class.
The binding
<reference name="weather">
<binding.ws
wsdlElement="http://www.webservicex.net#wsdl.port(WeatherForecast/WeatherForecastSoap)"
/>
</reference>
the corresponding wsdl
<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions targetNamespace="http://www.webservicex.net"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<wsdl:import namespace="http://www.webservicex.net"
location="http://www.webservicex.net/WeatherForecast.asmx?wsdl" />
</wsdl:definitions>
and the TestClient:
@Reference
protected WeatherService weather;
...
GetWeatherByPlaceNameResult result = weather.GetWeatherByPlaceName("New
York");
System.out.println(result.getPlaceName());
but this time the POJO is always empty !
If I changed the interface WeatherService to
@Remotable
public interface WeatherService {
OMElement GetWeatherByPlaceName(String placeName) throws
java.rmi.RemoteException;
}
I got the data but this is not transparent anymore!
Any ideas why the GetWeatherByPlaceNameResult object is always empty ?
Mit freundlichem Gruß / Kind regards
Martin Thoma