Webservice-cxf:Could not find portType named {http://impl.client.tianyuan.com/}SchedulerService

来源:互联网 发布:贵州 大数据大诚信 编辑:程序博客网 时间:2024/06/05 07:39

最近在做一个和webService有关的项目。

在使用客户端调取服务端的接口方法时,报如下错误:

十月 25, 2017 10:39:58 上午 org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean buildServiceFromWSDL
信息: Creating Service {http://impl.service.tianyuan.com/}SchedulerServiceC from WSDL: http://192.168.254.231:8080/SchedulerService?wsdl
Exception in thread "main" javax.xml.ws.WebServiceException: org.apache.cxf.service.factory.ServiceConstructionException: Could not find portType named {http://service.tianyuan.com/}SchedulerService
at org.apache.cxf.jaxws.ServiceImpl.getPort(ServiceImpl.java:361)
at org.apache.cxf.jaxws.ServiceImpl.getPort(ServiceImpl.java:350)
at javax.xml.ws.Service.getPort(Service.java:119)
at com.tianyuan.client.impl.SchedulerServiceC.getSchedulerServicePort(SchedulerServiceC.java:78)
at com.tianyuan.client.impl.SchedulerService_SchedulerServicePort_Client.main(SchedulerService_SchedulerServicePort_Client.java:47)
Caused by: org.apache.cxf.service.factory.ServiceConstructionException: Could not find portType named {http://service.tianyuan.com/}SchedulerService
at org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean.getInterfaceInfo(ReflectionServiceFactoryBean.java:631)
at org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean.initializeWSDLOperations(ReflectionServiceFactoryBean.java:639)
at org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean.initializeWSDLOperations(JaxWsServiceFactoryBean.java:303)
at org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean.buildServiceFromWSDL(ReflectionServiceFactoryBean.java:415)
at org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean.initializeServiceModel(ReflectionServiceFactoryBean.java:525)
at org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean.create(ReflectionServiceFactoryBean.java:261)
at org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean.create(JaxWsServiceFactoryBean.java:215)
at org.apache.cxf.frontend.AbstractWSDLBasedEndpointFactory.createEndpoint(AbstractWSDLBasedEndpointFactory.java:102)
at org.apache.cxf.frontend.ClientFactoryBean.create(ClientFactoryBean.java:91)
at org.apache.cxf.frontend.ClientProxyFactoryBean.create(ClientProxyFactoryBean.java:157)
at org.apache.cxf.jaxws.JaxWsProxyFactoryBean.create(JaxWsProxyFactoryBean.java:142)
at org.apache.cxf.jaxws.ServiceImpl.createPort(ServiceImpl.java:493)
at org.apache.cxf.jaxws.ServiceImpl.getPort(ServiceImpl.java:359)
... 4 more

初看错误的大致意思是:在 {http://service.tianyuan.com/}命名空间中找不到SchedulerService。其中{http://service.tianyuan.com/}表示的是服务端的命名空间。所以错误翻译过来是,在服务端的service.tianyuan.com命名空间中,找不到SchedulerService。

大致原因是:

客户端代码中,有两处需要注意:

1、生成的客户端接口的实现类中有QName的service对象和**(接口名)ServicePort对象,其中的namespaceURI(http://*****)应该与f发出后的服务端的definitions标签的targetNameSpace一致。

2、客户端接口中,标注在类名上的@WebService接口中有targetNameSpace属性和name属性,targetNameSpace表示的是命名空间,应该与服务端接口上的targetNameSpace属性的值一致,其中name属性的值也应该一致。

参考请往下翻,见 图++ 和 图-- 

想具体了解,请继续往下看:


服务端代码目录:


各个类的作用如下:

bean包中:

soapui生成的各种实体类;

impl包中:

1、第一个类可以无视,是soapui生成的启动服务端的类(当然该类中含有main方法),可以通过该类发布服务端,我自己写了一个类通过Endpoint来发布了服务端;

2、SchedulerServicePortImpl.java是一个实现类,实现的是根目录中最后一个SchedulerService.java接口,代码如下:

SchedulerServicePortImpl类:


在实现类中,与其接口一样,类名上上存在@WebService的标签,意思是将当前类暴露为WebService,其中实现类中的endpointInterface属性是必不可少的,而且,必须正确的指向该实现类的接口,并且包含该接口(也就是服务端的接口),

main包中:

Service.java是自己写的通过endpoint的方式来发布服务端的类(含有main方法),代码如下:

Service类:


最后我再介绍最后一个类——SchedulerService.java:

准确的来说是一个接口,他是wsdl文档中规定的接口,该接口中含有暴露给客户端的方法(直白的说就是客户端可以调用这些方法)。通过soapui软件;生成java代码后,会自动实现该接口中的方法,也就是说在impl包中的第二个类中,就是对该接口的各个方法的实现,如下图:

SchedulerService接口:


其中targetNameSpace代表命名空间,如果有客户端想访问该服务端,那么客户端接口上的命名空间应该与此一致。见下图++和图--。

客户端代码目录:


各个类的作用如下:

bean包中:

依旧是生成的实体类;

impl包中:

1、第一个类是soapui生成的启动客户端的main入口;

2、第二个类是客户端根据wsdl生成的客户端接口;

3、第三个类是客户端接口的实现类;

根目录下:

这三个包不清楚有什么用。。。。。

分析:

使用客户端调用服务端接口的方法时,肯定需要先调用服务端所提供接口中的方法,所以,客户端中的接口就应该与服务端中的接口关联起来,通过客户端的接口,调用服务端接口中的方法,所以,解决问题的地方就在客户端的接口和服务端的接口中。

而两个接口相连的重要属性,就是@WebService标签中的targetNameSpace属性(命名空间)

客户端接口代码:

@WebService中,targetNameSpace表示命名空间,必须与服务端接口的命名空间一致,name的值也应该互相一致。


        图++

客户端接口实现类代码:

new QName中,namesapceURI是与definitions标签中的targetNamespace的值一致的。

namesapceURI:在这里就是http://impl.service.tianyuan.com/

definitions标签:发布服务端后,在浏览器上查看服务端的根标签。


           图--

提示:

在生成的项目中,你会看到许多的targetNameSpace和http:// * * */的字眼,除了接口和实现类中,还有实体类中。这些和包结构是没有关系的。

需要注意的就是,客户端的命名空间 与对应的命名空间 。二者的值相等就可以了。


如果有不懂,或是不理解的同学,可以私信我,或者是下方留言,我看到后会及时回复的。
虽然,,,我也是一个小白。


阅读全文
0 0