JAXB + Spring WS: "Kein Adapter für Endpunkt" bei der Verwendung von JAXBElement

8

Ich habe einen Webdienst, den ich mit Spring und Jaxb zu implementieren versuche. Ich habe bereits eine Handvoll funktionierender Dienste, die beide verwenden - aber dieser spezielle Dienst bereitet mir aufgrund des Formats der Antwort Schwierigkeiten. In meiner XSD ist die Antwort wie folgt definiert (beachten Sie, dass es sich um ein einzelnes Element handelt):

%Vor%

Ich habe eine Service-Methode, die folgendermaßen aussieht:

%Vor%

Ich habe am Ende eine Ausnahme, die so aussieht:

java.lang.IllegalStateException: Kein Adapter für Endpunkt [public dortman.xsd.objects.Outcome dortman.annotated.MyTestEndpoint.processFileRequest (dortman.xsd.objects.ServiceRequest)]: Gibt es in Ihrem Endpunkt eine unterstützte Schnittstelle wie Message oder PayloadEndpoint implementieren

einige verwandten Beiträge auf dem Spring Forum und Stackoverflow Nach der Feststellung, so scheint es, dass die Rückkehr Objekte müssen entweder die XmlRootElement Anmerkung haben oder in einem JAXBElement gewickelt werden. Um die erste zu versuchen, änderte ich die Antwort in der XSD zu:

%Vor%

Das funktioniert, da JAXB dann eine ServiceResponse-Klasse mit der XmlRootElement-Annotation generiert. Leider habe ich nicht unbedingt den Spielraum, den XSD zu ändern - was bedeutet, dass ich die andere Option verfolgen muss. Also habe ich das versucht. Meine neue Service-Methode sieht folgendermaßen aus:

%Vor%

Und dann umschließe ich mein Rückgabeobjekt mit der Methode, die für ObjectFactory erstellt wurde:

%Vor%

Ich feile den Server an und erwarte, dass dies das Problem löst. Aber stattdessen bekomme ich:

java.lang.IllegalStateException: Kein Adapter für Endpunkt [public javax.xml.bind.JAXBElement dortman.annotated.MyTestEndpoint.processFileRequest (dortman.xsd.objects.ServiceRequest)]: Implementiert Ihr Endpunkt eine unterstützte Schnittstelle wie MessageHandler oder PayloadEndpoint?         bei org.springframework.ws.server.MessageDispatcher.getEndpointAdapter (MessageDispatcher.java:283)         unter org.springframework.ws.server.MessageDispatcher.dispatch (MessageDispatcher.java:226)         unter org.springframework.ws.server.MessageDispatcher.receive (MessageDispatcher.java:169)         bei org.springframework.ws.transport.support.WebServiceMessageReceiverObjectSupport.handleConnection (WebServiceMessageReceiverObjectSupport.java:89)         at org.springframework.ws.transport.http.WebServiceMessageReceiverHandlerAdapter.handle (WebServiceMessageReceiverHandlerAdapter.java:57)         unter org.springframework.ws.transport.http.MessageDispatcherServlet.doService (MessageDispatcherServlet.java:231)         bei weblogic.servlet.internal.WebAppServletContext.execute (WebAppServletContext.java:2174)         bei weblogic.servlet.internal.ServletRequestImpl.run (ServletRequestImpl.java:1446)         bei weblogic.work.ExecuteThread.execute (ExecuteThread.java:201)         bei weblogic.work.ExecuteThread.run (ExecuteThread.java:173)

Anscheinend war es nicht von meiner Verwendung von JAXBElement beeindruckt. Ist jemand anderes auf dieses Problem gestoßen?

Meine Konfigurationsdatei (die bereits mit ~ 6 Web-Services arbeitet, nur dass keiner von ihnen diese bestimmte XSD-Variante aufweist) enthält Folgendes:

%Vor%     
Dave 12.02.2011, 01:33
quelle

3 Antworten

7

Es ist XSD-bezogenes Problem, Sie müssen Ihre XSD korrigieren. Im Allgemeinen, wenn Sie mit JAXB spielen, wird dieses Problem auftreten, Sie müssen Anfrage und Antwort richtig definieren.

Dieses Problem wurde behoben. Zum Beispiel, wenn Ihr Eingabeanforderungselement 'InsertRequest' ist, müssen Sie also wie

definieren %Vor%

Zuvor wurde ich wie folgt definiert: - Wenn ich JAXB-Beans erzeuge, erzeugt es immer zwei Elemente dafür, welches Element ( InsertRequest oder InsertRequestType ) sich am Endpunkt beziehen muss, das war das Problem.

%Vor%     
Vivek 12.05.2011 07:42
quelle
1

Als ich dieses Problem hatte, stellte sich heraus, dass ich vergessen hatte, die Elementklasse in die Liste von classesToBeBound für den Spring Jaxb2Marshaller aufzunehmen. Das Hinzufügen dieser Elemente zur Liste hat das Problem behoben - aber unsere Elemente wurden bereits mit einem Inline-Komplextyp eingerichtet.

    
Peter Hart 05.07.2012 14:58
quelle
0

Sie sehen diesen Fehler, weil JAXB nicht weiß, welchen Namen das Stammelement geben soll, wenn Sie ein Objekt vom Typ Outcome zurückgeben. Wenn Sie Ihre Elemente aus dem Schema generieren, würde ich erwarten, dass Sie eine ServiceResponse-Klasse haben, die Sie stattdessen zurückgeben könnten.

Wenn Sie kein ServiceResponse-Objekt erhalten, hätte ich gedacht, dass Ihr Ansatz, das Ergebnis in ein JAXBElement zu integrieren, funktionieren sollte. Haben Sie überprüft, dass _ServiceResponse_QNAME mit dem richtigen Namespace-URI erstellt wurde?

    
rjsang 25.02.2011 16:30
quelle

Tags und Links