1. 程式人生 > >針對WebService使用Service類獲取Port類的一個引數問題解釋

針對WebService使用Service類獲取Port類的一個引數問題解釋

最後在學習WebService時,看到對於官方的例子是這樣寫的.

1 2 3 4 5 6 7 private static final QName PORT_NAME Service service = Service.create(SERVICE_NAME); service.addPort(PORT_NAME, SOAPBinding.SOAP11HTTP_BINDING, endpointAddress); HelloWorld hw = service.getPort(HelloWorld.class);

注意看上面的PORT_NAME的定義,是一個QName,其就有namespaceURI和一個name值,而在使用serivce獲取port時直接傳遞了介面名引數。
這樣的例子是可以執行的,這就導致了本人在編寫參考例子時,直接Copy了相應的程式碼,但是修改了各項名稱,在執行時,即始終執行不起來,相應的錯誤為

1 java.net.MalformedURLException: Invalid address. Endpoint address cannot be null.

以上的錯誤直接讓人找不到方向,而實際問題是,service根據所傳遞的資訊,在只傳遞了介面資訊時,會預設構建一個QName的資訊,再從service中尋找,如果尋找不到,自然就會產生上面的錯誤了。
在官方的例子中,它會預設構建HelloWorldPort這樣qname去尋找,而在進行service.add時,恰好新增的就是HelloWorldPort這個qname,那麼就恰好尋找到了。

而我們的例子,由於做了很多處理,導致預設新增到service的port的name並不是Service.class.getName+Port的組合,那麼自然就找不到相應的port了。而正確的做法,其實也很簡單,就是在獲取port的時候,手動地指定要獲取port類的qname,如下所示:

1 2 3 QName userServicePortQName = new QName(, "abcPort"); service.addPort(userServicePortQName, SOAPBinding.SOAP11HTTP_BINDING, ); UserService userService = service.getPort(userServicePortQName, UserService.class);

即在往service時新增什麼樣的port,那麼在獲取時就使用什麼樣的qname。再一步理解,addPort這個方法就可以理解為以鍵值對的方式往service裡追加port,那麼在獲取的時候自然就要提供相應的key值了。如果不提供,就會使用預設的生成策略建立一個key值,那這個key值與addPort使用的key值不一樣的話,自然就會產生上面的錯誤了。