最后在学习WebService时,看到对于官方的例子是这样写的.
privatestatic final QName PORT_NAME =newQName("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了相应的代码,但是修改了各项名称,在运行时,即始终运行不起来,相应的错误为
java.net.MalformedURLException: Invalid address. Endpoint address cannot be null.
在官方的例子中,它会默认构建HelloWorldPort这样qname去寻找,而在进行service.add时,恰好添加的就是HelloWorldPort这个qname,那么就恰好寻找到了。
而我们的例子,由于做了很多处理,导致默认添加到service的port的name并不是Service.class.getName+Port的组合,那么自然就找不到相应的port了。而正确的做法,其实也很简单,就是在获取port的时候,手动地指定要获取port类的qname,如下所示:
QName userServicePortQName = newQName("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);
备注:本文转载自:http://www.iflym.com/index.php/tag/cxf