0

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しても役に立ちませんが、内部で奇妙なことが起こっています。

4

1 に答える 1

0

その理由は、Flexjson (デシリアライザー) がセット (または JSON 配列) または Param オブジェクト (JSON オブジェクト形式) を期待しているが、代わりに整数の配列を見つけているためです。Flexjson は Spring や Roo について何も知らないため、整数を ID として認識せず、適切な Finder でそれらを検索しません。

解決策は、を呼び出すに、コントローラーでこれらの種類の ID 参照を手動で解析することJSONDeserializer.deserialize()です。いつかこれが@RooJsonアドオンの機能になるかもしれませんが (関連する問題)、まだです。

于 2012-10-10T11:30:04.440 に答える