Как решить ServiceConstructionException: Не удалось найти определение для службы?

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

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

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

Спасибо!

Ответ 1

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

WSDL:

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

Класс Webservice:

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

Ответ 2

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

<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 это произойдет.

Ответ 3

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