Web MVC と自動生成された JSON コントローラーを使用して、データベースへの REST API として使用しようとしている標準の Spring Roo プロジェクトがあります。フォーム データまたは JSON (できれば JSON) を介してオブジェクトを作成する POST 要求を送信しようとしていますが、かなり奇妙な動作をしています。
階層エンティティには、親としてそれ自体へのオプションの参照があります。次のようになります。
public class LandType {
private String name;
private String description;
@ManyToOne
private LandType parent;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "parent")
private Set<LandType> children = new HashSet<LandType>();
@ManyToMany(cascade = CascadeType.ALL)
private Set<Param> params = new HashSet<Param>();
}
親の値なし(名前と説明のみ) でJSON POST リクエストを介して新しいインスタンスを作成しようとすると、機能します。親の値を使用して作成しようとすると(親 ID を整数として使用します。これはストック Roo フォームが行うことです)、Spring エラーが発生します。
java.lang.Integer cannot be cast to java.util.Map
何かをマップに変換しようとして何をしているのかわかりません。デバッガーでそれを追跡することはほとんど意味がありません。コントローラーを介して fromJsonToLandType に入り、逆シリアル化を試みて、最終的に例外をスローします。
flexjson.factories.BeanObjectFactory.instantiate(BeanObjectFactory.java:17)
flexjson.ObjectBinder.bind(ObjectBinder.java:86)
flexjson.ObjectBinder.bindIntoObject(ObjectBinder.java:139)
flexjson.factories.ClassLocatorObjectFactory.instantiate(ClassLocatorObjectFactory.java:38)
flexjson.ObjectBinder.bind(ObjectBinder.java:86)
flexjson.ObjectBinder.bind(ObjectBinder.java:65)
flexjson.JSONDeserializer.deserialize(JSONDeserializer.java:158)
...
パラメータの配列を {..., 'params': [10, 11]} として渡そうとすると、同じようなことが起こります。Spring Roo は非プリミティブ型の JSON 入力を処理する方法をよくわかっていないようです。または、JSON 入力をどの形式で提供すればよいかわかりません。ここで何が間違っているのでしょうか?
編集
私は主にcurlでこれをテストして、何が入るかを正確に制御しています。呼び出しの例は次のとおりです。
> curl -i -X POST -H "Content-type: application/json" -d "{'name':'test', 'description': 'test', 'parent': 8}" http://localhost:8080/mutopia-server/landtypes
... ここで、8 は既存の LandType の ID です。ここでも、削除parent
すると機能します。-H "Content-type: application/json"
奇妙なことに、標準の Roo コントローラー ( に置き換えてください)を介して標準フォーム データの呼び出しが機能する-H "Accept: text/html"
ようになったので、それほど緊急の問題ではありませんが、最終的には完全に機能する JSON REST API が必要になります。この時点で JSON コントローラーが呼び出されているため、追加Accept: application/json
しても役に立ちませんが、内部で奇妙なことが起こっています。