我正在使用jUDDI v3.0.4客户端来查询UDDI服务器(juddi-portal-bundle-3.0.4)。我的兴趣是找到一个服务(我成功了)并查询其绑定模板,实际上是为了让接入点 WSDL 能够在以后查询 Web 服务。
只有当我知道绑定模板密钥时,我才能获得接入点,这是我通过与 UDDI 服务器一起发布的 Pluto 门户获得的。
当我尝试使用FindBinding对象查询服务的BindingTemplates时,我得到"javax.xml.ws.soap.SOAPFaultException:必须至少提供一个categoryBag,find_tModel或tModelBag"。但是我无法在 FindBinding 对象中填写任何这些内容。
我错过了什么吗?,这不是以后获取服务模板及其WSDL的正确方法吗?
谢谢。
奥斯卡。
我找到了解决方案。关键是通过业务服务对象查找绑定模板,这会传递到 BindingTemplate 对象。
所以
- 通过 UDDIInquiryPortType 提供的 findService(FindService fs) API 查询服务密钥。
- 对于返回的服务列表,获取包含服务密钥的服务信息对象。
- 给定您要查找的服务密钥(findService 可能通过 Name 对象限定范围),通过 UDDIInquiryPortType 提供的 getServiceDetail(GetServiceDetail sd) API 获取服务详细信息,其中 GetServiceDetail 对象使用服务密钥填充。
- 上一个查询返回的 ServiceDetail 对象列表将引导您进入包含 Web 服务定义 (WSDL) 的绑定模板。
希望对您有所帮助。
> 感谢秦玉珠的帮助。代码可以如下所示:
ServiceList list1=inquiryService.findService(findservice);
GetServiceDetail gsd=new GetServiceDetail();
for(ServiceInfo serviceInfo :list1.getServiceInfos().getServiceInfo()){
gsd.getServiceKey().add(serviceInfo.getServiceKey());
System.out.println(serviceInfo.getServiceKey());
String servicekey=serviceInfo.getServiceKey();
GetServiceDetail getServiceDetail=new GetServiceDetail();
getServiceDetail.setAuthInfo(authinfo);
getServiceDetail.getServiceKey().add(servicekey);
ServiceDetail serviceDetail=inquiryService.getServiceDetail(getServiceDetail);
BusinessService businessservice=serviceDetail.getBusinessService().get(0);
System.out.println("fetched service name:"+businessservice.getName().get(0).getValue());
String bindingkey = businessservice.getBindingTemplates().getBindingTemplate().get(0).getBindingKey();
System.out.println(bindingkey);
GetBindingDetail gbd = new GetBindingDetail();
gbd.setAuthInfo(authinfo);
gbd.getBindingKey().add(bindingkey);
BindingDetail bindingdetail=inquiryService.getBindingDetail(gbd);
BindingTemplate bindingtemplate=bindingdetail.getBindingTemplate().get(0);
String accesspoint=bindingtemplate.getAccessPoint().getValue();
System.out.println(accesspoint);
}