JSONは次のように作成します。
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})
});
これは送信されるJSONです。
{"subscription":{"manager":{"username":"admin","password":"admin"},"userToSubscribe":{"username":"newuser","password":"newpassword","email":"[email protected]"},"openid":"myopenid"}}
そして、このJSONをラッパークラスにマッピングしたいと思います。これはラッパーです:
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;
}
}
Pom.xmlのjackson依存関係(私はSpring 3.1.0.RELEASEを使用しています):
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.10</version>
</dependency>
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>
そして、コントローラメソッドのヘッダー:
public @ResponseBody SimpleMessage subscribeUser(@RequestBody Subscription subscription)
POSTの結果として、400 Incorrect requestエラーが表示されます。これを実行することは可能ですか、それとも@RequestBody
文字列または@RequestBody Map<String,Object>
そして、JSONを自分でデコードしますか?
ありがとう!
私自身の質問に答えます。まず何が起こっているのかを調査するための鍵をくれたSotirios Delimanolisに特に感謝します。
ご存知のように、私はビューから次のjsonを作成します。
{"manager":{"username":"admin","password":"admin"},"userToSubscribe":{"username":"newuser","password":"newpassword","email":"[email protected]"},"openid":"https://myopenid..."}
オブジェクトサブスクリプションとvarサブスクリプションを作成する必要がないことに気付いたので、少し変更しました。このようにJSONを作成すると、完全に機能します。
var manager = {
username: "admin",
password: "admin"
};
var userToSubscribe = {
username: "newuser",
password: "newpassword",
email: "[email protected]"
};
var openid = "https://myopenid...";
$.ajax({
url: '/dp/rest/isUserSuscribed.json',
type: 'POST',
dataType: 'json',
contentType: 'application/json',
mimeType: 'application/json',
data: JSON.stringify({manager : manager, userToSubscribe : userToSubscribe, openid : openid})
});
コントローラはこのjsonを受け取ります:
@RequestMapping(method=RequestMethod.POST, value="/isUserSuscribed.json")
public @ResponseBody ResponseMessageElement<Boolean> isUserSuscribed(@RequestBody SubscriptionWrapper subscription){
そして、SubscriptionWrapper ...
private static class SubscriptionWrapper {
BasicUser manager;
BasicUser userToSubscribe;
String openid;
public BasicUser getManager() {
return manager;
}
public void setManager(BasicUser manager) {
this.manager = manager;
}
public BasicUser getUserToSubscribe() {
return userToSubscribe;
}
public void setUserToSubscribe(BasicUser userToSubscribe) {
this.userToSubscribe = userToSubscribe;
}
public String getOpenid() {
return openid;
}
public void setOpenid(String openid) {
this.openid = openid;
}
}
だから…問題は何ですか? Incorrect Request 400エラーを受け取りました... Sotiriosが示唆したように、MappingJackson2HttpMessageConverterをデバッグしましたが、例外がありました(適切なコンストラクターがありません)。ジャクソンマッピングは、このクラスが静的でないかどうかに関係なく、内部クラスを構築できません。 SubscriptionWrapperを静的に設定することが私の問題の解決策でした。
これらの回答を確認することもできます: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
逆シリアル化に問題がある場合は、これを確認してください:http://stackoverflow.com/questions/17400850/is-jackson-really-unable-to-deserialize-json-into-a-generic-type
すべての返信をありがとう。
JSONを確認する
{
"subscription": {
"manager": {
"username": "admin",
"password": "admin"
},
"userToSubscribe": {
"username": "newuser",
"password": "newpassword",
"email": "[email protected]"
},
"openid": "myopenid"
}
}
ルート要素はsubscription
であり、JSONオブジェクトです。 Subscription
クラスにsubscription
フィールドがありません。したがって、subscription
要素をマップするものは何もないため、400 Bad Requestで失敗します。
クラスを作成するSubscriptionWrapper
public class SubscriptionWrapper {
private Subscription subscription;
public Subscription getSubscription() {
return subscription;
}
public void setSubscription(Subscription subscription) {
this.subscription = subscription;
}
}
ハンドラーメソッドを変更して、このタイプの引数を受け入れる
public @ResponseBody SimpleMessage subscribeUser(@RequestBody SubscriptionWrapper subscriptionWrapper)
ObjectMapper
でMappingJacksonHttpMessageConverter
を構成する必要がある場合があります(FYIを使用する必要がありますMappingJackso2nHttpMessageConverter
)、欠落しているプロパティを無視するようにします。
自分でこれを行う必要はありません。この依存関係をpomに追加する必要があります。
<dependencies>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.8.5</version>
</dependency>
</dependencies>
その後、Springが変換を行います。