2012-06-02 3 views
15

Ich habe Probleme mit Jackson, um eine Javascript gepostet JSON Array von Hashes (Tag) zuordnen.Karte JSON Array von Objekten zu @RequestBody Liste <T> mit Jackson


Hier werden die Daten von der Steuerung @RequestBody empfangen ist (Es ist mit der richtigen json Request senden):

[{name=tag1}, {name=tag2}, {name=tag3}] 


Hier ist die Steuerung:

@RequestMapping(value = "purchases/{purchaseId}/tags", method = RequestMethod.POST, params = "manyTags") 
@ResponseStatus(HttpStatus.CREATED) 
public void createAll(@PathVariable("purchaseId") final Long purchaseId, @RequestBody final List<Tag> entities) 
{ 
     Purchase purchase = purchaseService.getById(purchaseId); 

     Set<Tag> tags = purchase.getTags(); 
     purchaseService.updatePurchase(purchase); 
    } 

Wenn ich debug und den 'entities' -Wert anzeigen, den er als ArrayList von generischen Objekten anzeigt, nicht als Liste von Objekten vom Typ 'Tag', wie ich es erwarten würde.

Wie bekomme ich Jackson, um eine übergebene Array von Objekten zu einer Liste von Objekten des Typs 'Tag' zuordnen?

Dank

+0

Sie es so versucht haben? '{{" name "=" tag1 "}, {" name "=" tag2 "}, {" name "=" tag3 "}]' –

+0

Ich habe nicht versucht, dass Sean, ich ging mit der Lösung der Verwendung eines Array für das @RequestBody stattdessen. Siehe http://stackoverflow.com/questions/4441557/rest-with-spring-and-jackson-full-data-binding –

Antwort

39

Es klingt wie der Frühling volle Typinformationen aus irgendeinem Grunde nicht vorbei, sondern eine Art löschte Version, als ob Erklärung etwas wie List<?> tag war. Ich weiß nicht, was in vollem Umfang durchgeführt werden können, um dieses Problem zu beheben (kann etwas von Spring Integrationsteam müssen), sondern ein Work-around ist Ihre eigene Art wie zu definieren:

static class TagList extends ArrayList<Tag> { } 

und verwenden, die statt. Dies wird die generische Parametrisierung durch Super-Type-Deklarationen beibehalten, so dass Jackson, selbst wenn Spring nur das Äquivalent von TagList.class übergibt, den Parameter Tag herausfinden kann.

+0

Prost StaxMan .... Ich stieß auf den folgenden Link, der eine Reihe von Optionen zusätzlich zu bietet dein hier. http://stackoverflow.com/questions/4441557/rest-with-spring-and-jackson-full-data-binding –

+0

Dank StaxMan. Ich hatte dasselbe Problem. Deine Antwort hat mir geholfen. –

+0

Das ist so einfach und praktisch, ich benutze dies in meiner Android App. Danke – Gino

16

Ein anderer Weg, dies zu tun, ist ein Array als eine Liste zu erhalten und nicht, wie folgt:

ohne Parameter auf benutzerdefinierte Objekte
@RequestBody Tag[] entities 
+0

Ok ja Thomas wollte eine Liste von Tags erhalten, aber da dies nicht funktioniert, habe ich vorgeschlagen, lieber ein Array zu erhalten.Ich habe vor einiger Zeit mit dem gleichen Problem gekämpft, und im Moment werden die Objekte in der Liste, das generische Objekt, nicht erstellt, vielleicht wird das in Zukunft behoben, ich weiß es nicht, also anstatt eine Liste zu erhalten durch das RequestBody sollte man eher ein Array dieses spezifischen Objekts erhalten, ohne dass etwas auf der Senderseite geändert werden muss. – liloboy

0

Jackson erfordert einen Standardkonstruktor, so dass Sie nur ein benötigen hinzufügen Standardkonstruktor zu Ihrer Klasse Tag.

In Ihrem Fall einfach Ihre Tag Klasse hinzufügen:

public Tag(){} 
Verwandte Themen