2011-01-13 10 views
10

Tengo una aplicación simple con un servicio web creado con Apache CXF. Esta aplicación funciona cuando ejecuto el servidor y el cliente (como aplicaciones Java). Cuando trato de acceder a la aplicación /services URL que está mapeada en web.xml, Tomcat me da error 404. Cuando ejecuto el proyecto que recibirá:Cómo resolver ServiceConstructionException: ¿No se pudo encontrar la definición de servicio?

org.apache.cxf.service.factory.ServiceConstructionException: No se pudo encontrar la definición para el servicio {http: // sendmessage /} SendMessage

Si alguien tiene cualquier sugerencia relacionada con este error, me gustaría escucharlos. (Busqué en Google y no pude encontrar algo relevante para mi situación)

¡Gracias!

+0

Aquí hay una pregunta relacionada. http://stackoverflow.com/questions/3006185/cxf-client-webservice-question –

Respuesta

9

Tuve el mismo error, el mío estaba relacionado con el espacio de nombres que eran diferentes en wsdl y webservice. Así que los cambié a lo mismo.

WSDL: Clase

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

servicio web:

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

Incluso yo tenía un problema similar. Se solucionó actualizando jaxws: endpoint. Agregué el serviceName (asignación al nombre presente en el archivo WSDL) con el espacio de nombre como se define en el "targetNamespace" definido en la etiqueta wsdl: definitions.

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

editado (06Jul)
Además, tengo hoy que, con Apache CXF versión 3.0.5 esta cuestión no está llegando; Pero con la versión Apache CXF 3.1, esto viene.

1

ServiceConstructionException puede ocurrir en varias etapas cuando cxf compara el servicio proporcionado, el puerto y el nombre de enlace con el wsdl que ya ha analizado. En este caso (y en la mayoría de los casos) parece ser un problema de espacio de nombres.

{http://sendmessage/}SendMessage no está presente en el archivo wsdl analizado o el nombre del servicio no coincide con el QName presente en el WSDL. También hay otros casos en los que el enlace o el puerto no coinciden, uno podría recibir la misma excepción. Lo que sigue es un snippit de código del método org.apache.cxf.wsdl11.WSDLServiceFactory.create() donde sucede todo.

Si no está claro por qué sucede exactamente, lo mejor es depurar este fragmento de código y ver dónde está fallando y qué hay en la definición wdsl analizada (com.ibm.wsdl.DefinitionImpl en 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)); 
      } 

PD: Sé que este tema se abrió de nuevo en 2011 pero recientemente se enfrentó al mismo problema y fue capaz de resolverlo. Espero que ayude a otros que se enfrentan a este problema.

+0

Rajeev, su explicación me ayudó a resolver el problema –

Cuestiones relacionadas