我使用Eclipse“来自wsdl的Web服务客户端”,使用JBoss utils(兼容JAX-WS)生成了Web服务客户端。
因此,我提供的唯一内容是Web服务WSDL的URL。
现在,Web服务提供商告诉我更改Web服务的“客户端端点应用程序访问的URL”。
这是什么以及如何更改?
我使用Eclipse“来自wsdl的Web服务客户端”,使用JBoss utils(兼容JAX-WS)生成了Web服务客户端。
因此,我提供的唯一内容是Web服务WSDL的URL。
现在,Web服务提供商告诉我更改Web服务的“客户端端点应用程序访问的URL”。
这是什么以及如何更改?
Answers:
IMO,提供者告诉您更改服务端点(即访问Web服务的位置),而不是客户端端点(我不知道这可能是什么)。要更改服务端点,您基本上有两个选择。
第一个选项是更改(每个代理实现接口)的BindingProvider.ENDPOINT_ADDRESS_PROPERTY
属性值:BindingProvider
javax.xml.ws.BindingProvider
...
EchoService service = new EchoService();
Echo port = service.getEchoPort();
/* Set NEW Endpoint Location */
String endpointURL = "http://NEW_ENDPOINT_URL";
BindingProvider bp = (BindingProvider)port;
bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpointURL);
System.out.println("Server said: " + echo.echo(args[0]));
...
缺点是,这仅在原始WSDL仍可访问时才起作用。不建议。
第二个选项是从WSDL获取端点URL。
...
URL newEndpoint = new URL("NEW_ENDPOINT_URL");
QName qname = new QName("http://ws.mycompany.tld","EchoService");
EchoService service = new EchoService(newEndpoint, qname);
Echo port = service.getEchoPort();
System.out.println("Server said: " + echo.echo(args[0]));
...
wsimport
工具不再使用某种get[Service]Port
方法来生成代码。而是调用get[Service]
并将结果对象转换为,BindingProvider
以设置这些类型的属性。
为了在此提供一些说明,在创建服务时,服务类使用默认的“ wsdlLocation”,当从wsdl构建类时将其插入其中。因此,如果您有一个名为SomeService的服务类,并且创建了这样的实例:
SomeService someService = new SomeService();
如果查看SomeService内部,将看到构造函数如下所示:
public SomeService() {
super(__getWsdlLocation(), SOMESERVICE_QNAME);
}
因此,如果希望它指向另一个URL,则只需使用带有URL参数的构造函数(也有6个构造函数用于设置qname和功能)。例如,如果您设置了一个在端口9999上侦听的本地TCP / IP监视器,并且您想要重定向到该URL:
URL newWsdlLocation = new URL("http://theServerName:9999/somePath");
SomeService someService = new SomeService(newWsdlLocation);
然后将在服务内部调用此构造函数:
public SomeService(URL wsdlLocation) {
super(wsdlLocation, SOMESERVICE_QNAME);
}
我不会像@Femi那样更改现有的address属性。您可以轻松地将新服务添加到“定义”部分。
<wsdl:service name="serviceMethodName_2">
<wsdl:port binding="tns:serviceMethodNameSoapBinding" name="serviceMethodName">
<soap:address location="http://new_end_point_adress"/>
</wsdl:port>
</wsdl:service>
这不需要将WSDL重新编译为Java,并且进行更新并不比您使用BindingProvider选项困难(顺便说一句对我来说不起作用)。
要更改结束地址属性,请编辑您的wsdl文件
<wsdl:definitions.......
<wsdl:service name="serviceMethodName">
<wsdl:port binding="tns:serviceMethodNameSoapBinding" name="serviceMethodName">
<soap:address location="http://service_end_point_adress"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>