Jaxb2Marshaller und primitive Typen
Ist es möglich, erstellen Sie eine web-service-operation mit primitiv oder grundlegende Java-Typen bei der Verwendung der Jaxb2Marschaller in spring-ws? Zum Beispiel eine Methode so Aussehen:
@Override
@PayloadRoot(localPart = "AddTaskRequest", namespace = "http://example.com/examplews/")
public long addTask(final Task task) throws AddTaskFault {
//do something
return 0;
}
Ich bin mit dem maven-jaxws-plugin zum erzeugen der Benutzeroberfläche und Modell-Klassen von meinem WSDL. Wenn ich versuche, rufen Sie den webservice bekomme ich die folgende Fehlermeldung:
java.lang.IllegalStateException: Kein adapter für den Endpunkt [...]: ist Ihre endpoint-Implementierung einer unterstützten interface MessageHandler oder PayloadEndpoint
Fand ich heraus, dass wenn ich die Methode ändern, dass:
@Override
@PayloadRoot(localPart = "AddTaskRequest", namespace = "http://example.com/examplews/")
public JAXBElement<Long> addTask(final JAXBElement<Task> task) throws AddTaskFault {
final ObjectFactory objectFactory = new ObjectFactory();
return objectFactory.createAddTaskResponse(0L);
}
Ich bin in der Lage, es zu nennen -, aber diese Signatur ist nicht kompatibel mit der Oberfläche, die mit dem maven-jaxws-plugin.
Was kann ich tun, um die Konfiguration von spring-ws, um in der Lage sein, auf die erste Art der Umsetzung oder zu sagen, maven jaxws-plugin zum generieren der zweiten Variante der Schnittstelle?
UPDATE: Meine relevanten spring-ws config-Einträge sehen so aus:
<bean id="marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="contextPath" value="com.example.examplews" />
</bean>
<bean class="org.springframework.ws.server.endpoint.adapter.GenericMarshallingMethodEndpointAdapter">
<constructor-arg ref="marshaller" />
</bean>
<bean class="org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping">
<property name="order" value="1" />
</bean>
- Können Sie veröffentlichen Sie Ihre spring-xml-Konfiguration? Ich hatte ein ähnliches problem, und ich löste es durch Konfiguration... es war eine Weile zurück, aber wenn Sie per post verkaufen kann ich überprüfen was meine richtige conf-war und post-Unterschiede.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beim Spring-WS ist, der versucht, eine
EndpointAdapter
zu einemEndpoint
, es prüft, ob alle Parameter der Endpunkt-Methode, plus den return-Wert, sind Arten bekannt, dieJaxb2Marshaller
, undlong
nicht. Konzeptionell macht dies Sinn, da JAXB hätte keine Ahnung, wie man einelong
in XML ohne weitere Informationen (was, woJAXBElement
kommt).Sollten Sie erkennen, dass Spring-WS ist nicht eine JAX-WS-Implementierung, und lässt keine Täuschung zu sein. Man kann nicht wirklich erwarten, dass JAX-WS generierten Artefakte und erwarten, dass Sie gerade arbeiten in Spring_WS, obwohl in vielen Fällen die Spring-WS ist flexibel genug, um mit Ihr umzugehen.
Hier ist alles relevante in meiner config, wie ich kann nicht wirklich sagen, was Sie könnte sich ändern, Sie sind ziemlich unterschiedlich, und es wurde ein Jahr und eine Hälfte, seit ich dies getan habe.
Hoffe, es hilft in gewisser Weise. Die Endpoint-Klasse hatte @Endpoint-Methoden @PayloadRoot. Sie hat nicht lange zurück, aber ich habe nicht wickeln meine Klasse in der JAXBElement entweder.
[Bearbeiten] Namensräume