天天看點

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

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

1 2 3 4 5 6 7

private

static

final

QName PORT_NAME

=

new

QName(

"http://server.hw.demo/"

,

"HelloWorldPort"

);

Service service = Service.create(SERVICE_NAME);

String endpointAddress =

"http://localhost:9000/helloWorld"

;

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(

"http://cxf.java.study.m_ylf.com/"

,

"abcPort"

);

service.addPort(userServicePortQName, SOAPBinding.SOAP11HTTP_BINDING,

"http://localhost:8080/userService"

);

UserService userService = service.getPort(userServicePortQName, UserService.

class

);

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

轉自http://www.iflym.com/index.php/code/201210230001.html

繼續閱讀