如何解决ServiceConstructionException:找不到服务的定义?

时间:2011-01-13 12:52:56

标签: web-services cxf

我有一个使用Apache CXF创建的Web服务的简单应用程序。当我运行服务器和客户端(作为Java应用程序)时,此应用程序工作。当我尝试访问/services中映射的应用web.xml网址时,Tomcat给出了404错误。当我运行项目时,我收到:

  

org.apache.cxf.service.factory.ServiceConstructionException:找不到服务的定义{http:// sendmessage /} SendMessage

如果有人有任何与此错误相关的提示,我会很高兴听到他们。 (我搜索谷歌,找不到与我的情况相关的东西)

谢谢!

4 个答案:

答案 0 :(得分:10)

我有同样的错误,我的命名空间与wsdl和webservice不同。所以我将它们改为同样的。

WSDL:

<wsdl:definitions name=""
    targetNamespace="http://www.example.org/yourservice/"

Webservice类:

@WebService(targetNamespace = "http://www.example.org/yourservice/",
.........

答案 1 :(得分:3)

即使我有类似的问题。 通过更新jaxws:endpoint来修复它。 我添加了serviceName(映射到WSDL文件中的名称),其名称为space,如wsdl:definitions标签中定义的“targetNamespace”中所定义。

<jaxws:endpoint id=".." implementor="..." serviceName="s:SERVICE_NAME_IN_WSDL"
xmlns:s="TARGET_NAME_SPACE_WSDL_DEFINTIONS"></jaxws:endpoint>

编辑(06Jul)
另外,我今天也知道,在Apache CXF 3.0.5版本中,这个问题还没有出现; 但是使用Apache CXF 3.1版本,这将会到来。

答案 2 :(得分:1)

当cxf将提供的服务,端口和绑定名称与已经解析的wsdl进行比较时,可以在各个阶段发生ServiceConstructionException。在这种情况下(在大多数情况下),它看起来是名称空间问题。

{http://sendmessage/}SendMessage要么在解析的wsdl中不存在,要么服务名称与WSDL中存在的QName不匹配。还有其他情况,绑定或端口不匹配,可能会收到相同的异常。以下是来自org.apache.cxf.wsdl11.WSDLServiceFactory.create()方法的代码snippit,这一切都发生了。

如果事情不清楚为什么会发生这种情况最好的办法就是调试这段代码并查看它的失败位置以及解析的wdsl定义中的内容(wsdl4j.jar中的com.ibm.wsdl.DefinitionImpl)。< / p>

        javax.wsdl.Service wsdlService = definition.getService(serviceName);
        if (wsdlService == null) {
            if ((!PartialWSDLProcessor.isServiceExisted(definition, serviceName))
                && (!PartialWSDLProcessor.isBindingExisted(definition, serviceName))
                && (PartialWSDLProcessor.isPortTypeExisted(definition, serviceName))) {
                try {
                    Map<QName, PortType> portTypes = CastUtils.cast(definition.getPortTypes());
                    String existPortName = null;
                    PortType portType = null;
                    for (QName existPortQName : portTypes.keySet()) {
                        existPortName = existPortQName.getLocalPart();
                        if (serviceName.getLocalPart().contains(existPortName)) {
                            portType = portTypes.get(existPortQName);
                            break;
                        }
                    }
                    WSDLFactory factory = WSDLFactory.newInstance();
                    ExtensionRegistry extReg = factory.newPopulatedExtensionRegistry();
                    Binding binding = PartialWSDLProcessor.doAppendBinding(definition, 
                                                                           existPortName, portType, extReg);
                    definition.addBinding(binding);
                    wsdlService = PartialWSDLProcessor.doAppendService(definition, 
                                                                       existPortName, extReg, binding);
                    definition.addService(wsdlService);
                } catch (Exception e) {
                    throw new ServiceConstructionException(new Message("NO_SUCH_SERVICE_EXC", LOG, serviceName));
                }
            } else {
                throw new ServiceConstructionException(new Message("NO_SUCH_SERVICE_EXC", LOG, serviceName));
            }
PS:我知道这个问题是在2011年开放的,但最近我遇到了同样的问题,并且能够解决它。我希望它可以帮助那些面临这个问题的人。

答案 3 :(得分:0)

Caused by: org.apache.cxf.service.factory.ServiceConstructionException: Could not find definition for port {http://localhost:9990/project/wsdl/targetName}targetNameSoap12.
at org.apache.cxf.wsdl11.WSDLServiceFactory.create(WSDLServiceFactory.java:179)
at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.buildServiceFromWSDL(ReflectionServiceFactoryBean.java:428)
at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.initializeServiceModel(ReflectionServiceFactoryBean.java:548)
at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.create(ReflectionServiceFactoryBean.java:265)
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.ServerFactoryBean.create(ServerFactoryBean.java:159)
at org.apache.cxf.jaxws.JaxWsServerFactoryBean.create(JaxWsServerFactoryBean.java:211)
at org.apache.cxf.jaxws.EndpointImpl.getServer(EndpointImpl.java:456)
at org.apache.cxf.jaxws.EndpointImpl.doPublish(EndpointImpl.java:334)
... 13 more

已解决的问题,在Web服务界面和合同WSDL中的注解@WebService(targetNameSpace =“ targetNameSoap12”)处进行定义。

例如:

...
<wsdl:service name='targetName'>
  <wsdl:port binding='tns:targetNameSoap12' name='targetNameSoap12'>
...