使用jax-ws的Metro覆盖端点地址

时间:2011-10-17 09:22:27

标签: java jax-ws

我正在使用 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 的新实例

任何人都能解释一下吗?

1 个答案:

答案 0 :(得分:1)

这些之间几乎没有(读:否)差异:

service.getHelloPort().sayHello("Hello World");

HelloPort proxy = service.getHelloPort();
proxy.sayHello("Hello World!");

service.getHelloPort()调用将始终返回新的代理/端口实例。因此,每当您修改给定端口对象的请求上下文时,修改都是特定端口实例的本地。

一般来说,只要您不修改请求/响应上下文,您获得的端口实例就是可重用和线程安全的。对于您发布的代码示例,它正在修改请求上下文以设置端点地址,因此建议每次需要时都获取一个新的端口对象,或者至少为每个需要的线程获取一个新对象一。 (threadlocal是你的朋友)