Spring / json: Konvertiert eine typisierte Sammlung wie List & lt; MyPojo & gt;
Ich versuche, Marschall eine Liste: List<Pojo>
Objekte über die Spring-Rest-Vorlage.
Kann ich weitergeben einfache Pojo
Objekte, aber ich finde keine Dokumentation, die beschreibt, wie das senden einer List<Pojo>
Objekte.
Frühjahr wird mit der Jackson-JSON-Umsetzung der HttpMessageConverter
. Die jackson-Dokumentation umfasst dieses:
Neben der Bindung an POJOs und
"einfache" Arten, es ist ein
zusätzliche Variante: die Bindung an
generische (typed) Container. In diesem Fall
erfordert spezielle Handhabung durch
sogenannte Type-Erasure (von Java
zum implementieren von generics in etwas
rückwärts-kompatiblen Art und Weise), die
verhindert, dass Sie mit so etwas wie
Collection<String>.class
(die nicht
nicht kompilieren).Also, wenn Sie wollen, binden Sie Daten in eine
Map<String,User>
benötigen Sie:
Map<String,User> result = mapper.readValue(src, new TypeReference<Map<String,User>>() {});
wo
TypeReference
ist nur erforderlich, um
pass generischen Typ-definition (via
anynomous innere Klasse in diesem Fall):
der wichtige Teil ist
<Map<String,User>>
definiert Art
zu binden.
Kann dies erreicht werden im Frühjahr Vorlage? Ich nahm einen Blick auf den code und es macht mir die Sache nicht, aber vielleicht habe ich einfach nicht wissen, einige Tricks.
Lösung
Die ultimative Lösung, Dank der hilfreichen Antworten weiter unten, war nicht senden Sie eine Liste, sondern senden ein einzelnes Objekt, das erweitert einfach die Liste, wie: class PojoList extends ArrayList<Pojo>
. Frühjahr erfolgreich Marschall dieses Objekt, und es leistet das gleiche wie das senden einer List<Pojo>
ist, obwohl es ein wenig weniger saubere Lösung. Ich postete auch JIRA im Frühjahr für Sie zum beheben dieses Manko in Ihren HttpMessageConverter
- Schnittstelle.
InformationsquelleAutor der Frage David Parks | 2011-05-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn ich lese, das docs für
MappingJacksonHttpMessageConverter
Recht, Sie haben zu erstellen und registrieren Sie eine Unterklasse vonMappingJacksonHttpMessageConverter
ab und setzen diegetJavaType(Klasse<?>)
Methode:InformationsquelleAutor der Antwort Sean Patrick Floyd
In Spring 3.2 es gibt jetzt die Unterstützung für generische Typen mit dem neuen
exchange()
-Methoden auf dieRestTemplate
:Funktioniert wie ein Charme!
InformationsquelleAutor der Antwort oehmiche
Ein Weg, um sicherzustellen, dass die generischen Typ-Parameter enthalten sind, ist eigentlich sub-Klasse List-oder Map-Typ, so dass Sie so etwas wie:
- und return-Instanz auf der Liste.
So, warum macht das einen Unterschied? Da generische Typ-Informationen erhalten in nur ein paar Plätze: Methode und Feld-Deklarationen und super Typ-Deklarationen. So, während "raw" Liste enthält KEINE runtime-Typ-Informationen, Klassen-definition von "MyStringList" tut, durch seinen Supertyp Erklärungen.
Beachten Sie, dass Zuordnungen zu scheinbar typisierte Variablen nicht helfen: es erzeugt nur mehr compile-Zeit syntaktischen Zucker: real geben Sie die Informationen nur weitergegeben oder mit Klassen-Instanzen (oder lib bereitgestellten Erweiterungen davon, wie JavaType und TypeReference in Jacksons Fall).
Andere als diese, würden Sie brauchen, um herauszufinden, wie pass Jackson entweder
JavaType
oderTypeReference
zu begleiten-Wert.InformationsquelleAutor der Antwort StaxMan