JAX-RS Rückgabe eines Map<String,String>
Möchte ich eine Karte abrufen, von einem mit JAX-RS (text/xml)
@GET
public Map<String,String> getMap(){
}
aber ich erhalte den folgenden Fehler:
0000001e FlushResultHa E org.apache.wink.server.internal.handlers.FlushResultHandler handleResponse The system could not find a javax.ws.rs.ext.MessageBodyWriter or a DataSourceProvider class for the java.util.HashMap type and application/x-ms-application mediaType. Ensure that a javax.ws.rs.ext.MessageBodyWriter exists in the JAX-RS application for the type and media type specified.
[10:43:52:885 IST 07/02/12] 0000001e RequestProces I org.apache.wink.server.internal.RequestProcessor logException The following error occurred during the invocation of the handlers chain: WebApplicationException (500 - Internal Server Error) with message 'null' while processing GET request sent to http://localhost:9080/jaxrs_module/echo/upload/getSiteNames
- Das ist toll. Was ist das problem?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Lösung, die ich wählen, ist, wickeln Sie die Karte und verwenden Sie es für die Rückkehr param.
und die Signatur der Methode wie folgt
Dein problem ist, dass die Standard-Serialisierung-Strategie (Nutzung JAXB) bedeutet, dass Sie nicht zu serialisieren, die Karte direkt. Es gibt zwei Möglichkeiten, um damit umzugehen.
Schreiben Sie eine
XmlAdaptor
Gibt es eine Reihe von Fragen auf, SO doch die schönste Erklärung, die ich bisher gesehen habe, ist auf die CXF-Anwender-mailing-Liste von vor ein paar Jahren. Das ein bisschen tricky (da Sie nicht wollen, eine zusätzliche wrapper-element) ist, dass wenn man einmal selbst eine Art Adapter, hast du die Installation mit einem Paket-level-annotation (auf die richtige Paket, die möglicherweise einige Mühe, um herauszufinden,). Die sind relativ exotisch.
Schreiben Sie eine benutzerdefinierte
MessageBodyWriter
Könnte es auch einfacher sein, zu schreiben Ihren eigenen code für die Serialisierung. Um dies zu tun, implementieren Sie
javax.ws.rs.ext.MessageBodyWriter
und markieren Sie Sie mit@Provider
(vorausgesetzt, Sie verwenden eine engine verwendet, die zur Registrierung verwalten; nicht alle tun, aus komplizierten Gründen, die don ' T Angelegenheit zu viel hier). Dies wird Ihnen erlauben, zu produzieren genau das Dokument, das Sie wollen, von jedem beliebigen Typs zu einem Preis von mehr Komplexität beim schreiben (aber mindestens Sie werden nicht mit komplexen JAXB-Probleme). Es gibt viele Möglichkeiten, um tatsächlich zu generieren von XML-Daten, mit denen diejenigen zu wählen, die zwischen je auf die Daten serialisiert werdenBeachten Sie, dass wenn Sie das streaming der Daten aus, anstatt Montage alles im Speicher, würden Sie haben um diese Schnittstelle zu implementieren.
Mithilfe von CXF 2.4.2, es unterstützt die Rückgabe der Karte von der api. Ich benutze jackson-jaxrs 1.9.6 für die Serialisierung.
Mit CXF 2.7.x verwenden Sie
,wie Sie diese in Ihrem rest-client-code.
für andere Sammlungen
WebClient.postAndGetCollection()
.