針對WebService使用Service類獲取Port類的一個引數問題解釋
阿新 • • 發佈:2019-01-03
最後在學習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值不一樣的話,自然就會產生上面的錯誤了。