2011-01-13 4 views
10

Ich habe eine einfache Anwendung mit einem Web-Service mit Apache CXF erstellt. Diese Anwendung funktioniert, wenn ich den Server und den Client (als Java Anwendungen) ausführen. Wenn ich versuche, auf die Anwendung /services URL zuzugreifen, die in web.xml zugeordnet ist, Tomcat gibt mir 404 Fehler. Als ich das Projekt ausführen ich erhalten:So lösen Sie ServiceConstructionException: Konnte die Definition für den Dienst nicht gefunden werden?

org.apache.cxf.service.factory.ServiceConstructionException: Konnte nicht Definition für Service finden {http: // Sendmessage /} Sendmessage

Wenn jemand irgendwelche Hinweise zu diesem Fehler würde ich mich freuen, sie zu hören. (Ich suchte Google und konnte etwas nicht finden, das für meine Situation relevant ist)

Danke!

+0

Hier ist eine verwandte Frage. http://stackoverflow.com/questions/3006185/cxf-client-webservice-question –

Antwort

9

Ich hatte den gleichen Fehler, meine war mit Namespace verwandt, die in WSDL und Webservice unterschiedlich waren. Also habe ich sie gleich geändert.

WSDL:

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

Klasse Webservice:

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

Auch hatte ich ein ähnliches Problem. Dies wurde behoben, indem der jaxws: Endpunkt aktualisiert wurde. Ich fügte den serviceName (Zuordnung zu dem in der WSDL-Datei vorhandenen Namen) mit dem Namensraum hinzu, wie im "targetNamespace" definiert, der im wsdl: definitions-Tag definiert wurde.

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

bearbeitet (06Jul)
Auch habe ich heute, dass mit Apache CXF 3.0.5 Version dieses Problem nicht kommt; Aber mit Apache CXF 3.1 Version, das kommt.

1

ServiceConstructionException kann in verschiedenen Phasen auftreten, wenn cxf den angegebenen Service-, Port- und Bindungsnamen mit der bereits analysierten WSDL vergleicht. In diesem Fall (und in den meisten Fällen) scheint es sich um ein Namespace-Problem zu handeln.

{http://sendmessage/}SendMessage ist entweder nicht in geparsten WSDL vorhanden oder der Dienstname stimmt nicht mit der QName in der WSDL überein. Es gibt auch andere Fälle, in denen die Bindung oder der Port nicht zusammenpassen, und die gleiche Ausnahme erhalten könnte. Im Folgenden ist ein Code-Snippit von org.apache.cxf.wsdl11.WSDLServiceFactory.create() Methode, wo alles passiert.

Wenn die Dinge nicht klar sind, warum genau passiert ist, ist die beste Wette, dieses Stück Code zu debuggen und zu sehen, wo es scheitert und was es in geparsten WDSL-Definition (com.ibm.wsdl.DefinitionImpl in wsdl4j.jar) gibt.

 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: Ich weiß, dass dieses Thema im Jahr 2011 wieder eröffnet wurde aber vor kurzem stand ich das gleiche Problem und konnte es lösen. Ich hoffe, es hilft anderen, die mit diesem Problem konfrontiert sind.

+0

Rajeev, half Ihre Erklärung mir, Problem zu lösen –

Verwandte Themen