Как решить ServiceConstructionException: Не удалось найти определение для службы? - PullRequest
11 голосов
/ 13 января 2011

У меня есть простое приложение с веб-сервисом, созданное с помощью Apache CXF.Это приложение работает, когда я запускаю сервер и клиент (как Java приложения).Когда я пытаюсь получить доступ к приложению /services URL, который отображается в web.xml, Tomcat выдает ошибку 404.Когда я запускаю проект, я получаю:

org.apache.cxf.service.factory.ServiceConstructionException: Не удалось найти определение для службы {http://sendmessage/}SendMessage

Если у кого-либо есть какие-либо советысвязанных с этой ошибкой я был бы рад их услышать.(Я искал в Google и не смог найти что-то подходящее для моей ситуации)

Спасибо!

Ответы [ 4 ]

10 голосов
/ 30 октября 2013

У меня была такая же ошибка, моя была связана с пространством имен, которые были разными в wsdl и webservice. Поэтому я изменил их на те же.

WSDL:

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

Класс веб-сервиса:

@WebService(targetNamespace = "http://www.example.org/yourservice/",
.........
3 голосов
/ 05 июля 2015

Даже у меня была похожая проблема. Исправлено путем обновления конечной точки jaxws: Я добавил serviceName (сопоставление имени, присутствующего в файле WSDL) с пространством имен, как определено в «targetNamespace», определенном в теге wsdl: definitions.

<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 это будет.

1 голос
/ 28 ноября 2016

ServiceConstructionException может возникать на разных этапах, когда cxf сравнивает предоставленный сервис, порт и имя привязки с wsdl, который он уже проанализировал.В этом случае (и в большинстве случаев) это выглядит как проблема пространства имен.

{http://sendmessage/}SendMessage либо отсутствует в разобранном wsdl, либо имя службы не совпадает с QName , присутствующим в WSDL.Есть и другие случаи, когда привязка или порт не совпадают, можно получить такое же исключение.Ниже приведен фрагмент кода из метода org.apache.cxf.wsdl11.WSDLServiceFactory.create(), где все это происходит.

Если неясно, почему именно это происходит, лучше всего отладить этот фрагмент кода и посмотреть, где он выходит из строя и чтотам в разобранном определении wdsl (com.ibm.wsdl.DefinitionImpl в wsdl4j.jar).

        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 году, но недавно я столкнулся с той же проблемой и смог ее решить.Я надеюсь, что это поможет другим, кто сталкивается с этой проблемой.

0 голосов
/ 24 октября 2018
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

Исправлена ​​проблема, определяемая в аннотации @WebService (targetNameSpace = "targetNameSoap12") в интерфейсе вашего веб-сервиса и в контракте WSDL.

Например:

...
<wsdl:service name='targetName'>
  <wsdl:port binding='tns:targetNameSoap12' name='targetNameSoap12'>
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...