2011-01-13 18 views
10

Ho una semplice applicazione con un servizio Web creato con Apache CXF. Questa applicazione funziona quando eseguo il server e il client (come applicazioni Java). Quando provo ad accedere all'URL dell'applicazione /services mappato in web.xml, Tomcat mi dà l'errore 404. Quando eseguo il progetto che riceverà:Come risolvere ServiceConstructionException: Impossibile trovare la definizione per il servizio?

org.apache.cxf.service.factory.ServiceConstructionException: Impossibile trovare la definizione per il servizio {http: // sendmessage /} SendMessage

Se qualcuno ha eventuali suggerimenti relativi a questo errore sarei lieto di ascoltarli. (Ho cercato su google e non ho trovato nulla di rilevante per la mia situazione)

Grazie!

+0

Ecco una domanda correlata. http://stackoverflow.com/questions/3006185/cxf-client-webservice-question –

risposta

9

Ho avuto lo stesso errore, il mio era relativo a namespace che erano diversi in wsdl e webservice. Così li ho cambiati allo stesso modo.

WSDL: classe

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

Webservice:

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

Anche ho avuto un problema simile. Sistemato aggiornando jaxws: endpoint. Ho aggiunto il nomeServizio (mappatura al nome presente nel file WSDL) con lo spazio dei nomi definito nello "spazio dei nomi target" definito nel tag wsdl: definizioni.

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

modificato (06Jul)
Inoltre, ho oggi che, con Apache CXF 3.0.5 versione questo problema non è venuta; Ma con la versione di Apache CXF 3.1, questo sta arrivando.

1

ServiceConstructionException può verificarsi in varie fasi quando cxf confronta il servizio fornito, la porta e il nome del binding con il wsdl che ha già analizzato. In questo caso (e nella maggior parte dei casi) sembra essere un problema di namespace.

{http://sendmessage/}SendMessage non è presente in wsdl analizzato o il nome del servizio non corrisponde a QName presente nel WSDL. Esistono anche altri casi in cui il binding o la porta non corrispondono, si potrebbe ricevere la stessa eccezione. Di seguito è riportato uno snippit di codice dal metodo org.apache.cxf.wsdl11.WSDLServiceFactory.create() in cui tutto avviene.

Se le cose non sono chiare perché esattamente sta accadendo la soluzione migliore è quella di eseguire il debug di questo pezzo di codice e vedere dove si sta venendo a mancare e che cosa c'è nel analizzata definizione wDSL (com.ibm.wsdl.DefinitionImpl in 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: So che questo problema è stato aperto nel 2011, ma di recente ho affrontato lo stesso problema ed è stato in grado di risolverlo. Spero che aiuti gli altri che stanno affrontando questo problema.

+0

Rajeev, la tua spiegazione mi ha aiutato a risolvere il problema –

Problemi correlati