Spring MVC @RequestBody erhalten einen Objekt-wrapper mit nicht-primitiven Parametern
Ich erstellen der JSON wie folgt:
var manager = {
username: "admin",
password: "admin"
};
var userToSubscribe = {
username: "newuser",
password: "newpassword",
email: "[email protected]"
};
var openid = "myopenid";
var subscription = {
manager: manager,
userToSubscribe : userToSubscribe,
openid : openid
};
$.ajax({
url: '/myapp/rest/subscribeUser.json',
type: 'POST',
dataType: 'json',
contentType: 'application/json',
mimeType: 'application/json',
data: JSON.stringify({subscription : subscription})
});
Dies ist die JSON gesendet:
{"subscription":{"manager":{"username":"admin","password":"admin"},"userToSubscribe":{"username":"newuser","password":"newpassword","email":"[email protected]"},"openid":"myopenid"}}
Und ich möchte diese Karte JSON, um eine Wrapper-Klasse. Dies ist der wrapper:
private class Subscription{
private User manager;
private User userToSubscribe;
private String openid;
public User getManager() {
return manager;
}
public void setManager(User manager) {
this.manager = manager;
}
public User getUserToSubscribe() {
return userToSubscribe;
}
public void setUserToSubscribe(User userToSubscribe) {
this.userToSubscribe = userToSubscribe;
}
public String getOpenid() {
return openid;
}
public void setOpenid(String openid) {
this.openid = openid;
}
}
Jackson Abhängigkeit in der pom.xml (ich bin mit spring 3.1.0.RELEASE):
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.10</version>
</dependency>
Das mapping in rest-servlet.xml
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="jsonConverter" />
</list>
</property>
</bean>
<bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
<property name="supportedMediaTypes" value="application/json" />
</bean>
Und der header von der controller-Methode:
public @ResponseBody SimpleMessage subscribeUser(@RequestBody Subscription subscription)
Als ein Ergebnis der POST erhalte ich einen 400-Falsche Anfrage Fehler. Ist es möglich dies zu tun, oder tun ich muss es tun mit @RequestBody
String oder @RequestBody Map<String,Object>
und decodieren des JSON mich?
Dank!
- Es sollte nichts Sie daran hindern, dies zu tun. Fehler 400 gibt etwas falsch mit der Anfrage oder die Zuordnung. Hat die
User
Klasse haben ein Standard no-arg-Konstruktor. - Der wrapper ist ein absolut anderes Konzept in Java, was Sie haben ein paar Objekte, die Sie wollen zu aggregieren, die in der äußeren Klasse.
- welche version von spring, die Sie verwenden?
- Können Sie nach dem mapping für die controller-Methode und der code, sendet die JSON?
- Geben Sie eine minute, ich werde den Beitrag aktualisieren
- Der post ist jetzt aktualisiert. Ich meine pom Abhängigkeiten, spring-version und die Wandler. Hoffe es hilft
Du musst angemeldet sein, um einen Kommentar abzugeben.
Blick auf Ihre JSON -
Das root-element ist
subscription
und es wird ein JSON-Objekt. IhreSubscription
Klasse keinensubscription
Feld. Also gibt es auch nichts zum anzeigen dersubscription
element und es daher nicht mit einem 400 Bad Request.Erstellen Sie eine Klasse
SubscriptionWrapper
und ändern Sie Ihre handler-Methode akzeptiert ein argument dieser Art
Müssen Sie möglicherweise konfigurieren Sie die
ObjectMapper
imMappingJacksonHttpMessageConverter
(FYI, Sie sollten mitMappingJackso2nHttpMessageConverter
), so dass es ignoriert fehlende Eigenschaften.com.fasterxml.jackson
.ObjectMapper
hat eineconfigure()
Methode, die Sie verwenden können, um zu konfigurieren, Deserialisierung und Serialisierung bietet. Vielleicht möchten Sie sich in einige von Ihnen.3.1.2
. Verwenden Sie einen debugger Schritt für Schritt durch dieMappingJackson2HttpMessageConverter
und sehen, was im Feld ist die Blockierung der Deserialisierung. Sie können auch Ihre log-level auf trace, um mehr details zu erhalten.Ich werde die Antwort auf meine eigene Frage. Zuerst besonderen Dank an Sotirios Delimanolis, denn er gab mir den Schlüssel, um zu untersuchen, was es passiert war.
Wie Sie wissen, ich erstellen Sie das folgende json-aus der Sicht:
Ich ihn ein bisschen verändert, weil ich gemerkt habe, dass ist nicht notwendig, um ein Objekt Abonnement und ein var-Abonnement. Wenn du die JSON wie diese, wird es perfekt funktionieren:
Den controller empfängt diese json:
Und die SubscriptionWrapper...
Also... Was ist das problem? Ich erhielt eine Falsche Request 400 Fehler... ich gedebuggt MappingJackson2HttpMessageConverter wie Sotirios vorgeschlagen und es war eine Ausnahme (Keine geeigneten Konstruktor). Jackson-Mapping ist nicht in der Lage zu bauen, eine innere Klasse, ob diese Klasse ist nicht statisch. Einstellung SubscriptionWrapper zu statisch war die Lösung für mein problem.
Können Sie auch überprüfen, diese Antworten:
http://stackoverflow.com/questions/8526333/jackson-error-no-suitable-constructor
http://stackoverflow.com/questions/12139380/how-to-convert-json-into-pojo-in-java-using-jackson
Und wenn Sie Probleme haben, zu Deserialisieren, check this:
http://stackoverflow.com/questions/17400850/is-jackson-really-unable-to-deserialize-json-into-a-generic-type
Danke für die vielen Antworten.
Brauchen Sie nicht, dies zu tun durch sich selbst. Man muss hinzufügen, diese Abhängigkeit in Ihrer pom:
Nach, dass der Frühling tun die Konvertierung für Sie.
@ResponseBody
.