Hi Frank,
That seems pretty reasonable to me, even-though it should only download
the wsdl the first time. But
your point is valid that it should work for servers that do not provide
the WSDLs also. I think your changes could be easily implemented as
configuration options in the client code. It'd be great if you can open
a jira for it and attach the code.
Cheers,
--Kurt
On 8/27/10 10:28 AM, Strickstrock, Frank wrote:
Hi,
If I understood correctly,the current juddi-client approach is
- to read the uddi_service wsdl from the UDDI Server
- parse it and extract the binding accesspoint from it.
I have to use a Microsoft UDDI, which does not provide the WSDL at all (as it
is available @ OASIS)
So I just put the WSDLs temporarily on a local tomcat and was able to get the
client running.
Sure the WSDLs could be deployed later on the IIS centrally but for performance
aspects I'd like to avoid this server roundtrip.
(also saves us from the need to deploy the WSDLs on each lifecyclestage server)
So I wondered whether there is any other way for instantiating the service and
port without the WSDL at a Server.
Below is my current code for the InquiryService in the JAXWSTransport.
Can you crosscheck with your project design and let me know, whether there any
concerns with this approach ?
public UDDIInquiryPortType getUDDIInquiryService(String endpointURL)
throws TransportException {
if (inquiryService==null) {
try {
// new QName for Service creation: with "UDDI_Service"
instead of "UDDI_Inquiry_Port";
QName qNameService = new
QName(UDDI_V3_SERVICE_NAMESPACE, INQUIRY_SERVICE_NAME);
// 1. instantiate Inquiry Service
Method createMethod =
Service.class.getDeclaredMethod("create", new Class[]{URL.class, QName.class});
URL url =
this.getClass().getClassLoader().getResource("uddi_v3_service.wsdl");
Service service =
(Service)createMethod.invoke(Service.class, new Object[]{url, qNameService});
// 2. get Inquiry Service Port
QName qNamePort = new
QName(UDDI_V3_SERVICE_NAMESPACE, INQUIRY_SERVICE);
// pass qName explicitly for Port constructor
inquiryService = (UDDIInquiryPortType)
service.getPort(qNamePort, UDDIInquiryPortType.class);
// 3. set concrete UDDI endpoint (taken from
configuration, may vary per lifecycle stage)
BindingProvider bp = (BindingProvider)
inquiryService;
bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
endpointURL);
return (UDDIInquiryPortType)bp;
} catch (Exception e) {
throw new TransportException(e.getMessage(), e);
}
}
return inquiryService;
}
Pros so far:
- The WSDL is part of the juddi-ws-3.0.3.jar.
- No server roundtrip needed
- No need to put the WSDLs on any HTTP server
Note: code can be improved still (e.g. endpointURL NPE)
Thanks Frank.