我正在使用 Metro 和 jax-ws 创建一个Web服务客户端,我想覆盖端点地址。
使用 2.11.1中的以下示例。 BindingProvider.ENDPOINT_ADDRESS_PROPERTY 我可以这样做: http://metro.java.net/guide/How_to_invoke_and_endpoint_by_overriding_endpoint_address_in_the_WSDL.html
//Create service and proxy from the generated Service class.
HelloService service = new HelloService();
HelloPort proxy = service.getHelloPort();
((BindingProvider)proxy).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
"http://new/endpointaddress");
proxy.sayHello("Hello World!");
但我不明白为什么我不能使用 service.getHelloPort()。sayHello(“Hello World!”)而不是 proxy.sayHello(“Hello World! “)如示例所示。如果我这样做,webservice客户端正在使用其默认端点地址而不是我想要使用的地址。
每次调用 getHelloPort()
时,我都会看到 HelloPort 的新实例任何人都能解释一下吗?
答案 0 :(得分:1)
这些之间几乎没有(读:否)差异:
service.getHelloPort().sayHello("Hello World");
和
HelloPort proxy = service.getHelloPort();
proxy.sayHello("Hello World!");
service.getHelloPort()调用将始终返回新的代理/端口实例。因此,每当您修改给定端口对象的请求上下文时,修改都是特定端口实例的本地。
一般来说,只要您不修改请求/响应上下文,您获得的端口实例就是可重用和线程安全的。对于您发布的代码示例,它正在修改请求上下文以设置端点地址,因此建议每次需要时都获取一个新的端口对象,或者至少为每个需要的线程获取一个新对象一。 (threadlocal是你的朋友)