2011-10-17 38 views
0

我正在創建一個web服務客戶端使用地鐵jax-ws我想重寫端點地址。jax-ws地鐵覆蓋終點地址

使用中的以下示例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!」)如示例所示。如果我這樣做,web服務客戶端正在使用其默認端點地址,而不是我想要使用的地址。

它看起來像我得到每次HelloPort的新實例,我稱之爲getHelloPort()

任何人都可以解釋一下嗎?

+0

你的代碼是什麼?你如何覆蓋終點地址?用代碼示例更新了 – Osw

+0

。我還得到了一些指針。 ()service.getHelloPort()== service.getHelloPort())輸出false,所以它真的看起來像我爲每個getHelloPort()調用得到一個新的實例 – Gotcha

回答

1

有一點(讀:無),這些區別:

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

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

的service.getHelloPort()調用總是會返回一個新的代理/端口實例。所以無論何時您修改給定端口對象的請求上下文,該端口對象的修改都是特定端口實例的本地修改。

一般而言,只要不修改請求/響應上下文,通常而言,您獲取的端口實例可重用且線程安全。對於您發佈的代碼示例,它正在修改請求上下文以設置端點地址,因此建議您在每次需要時都獲取新的端口對象,或者至少爲每個需要的線程獲取新對象一。 (threadlocal是你的朋友)