1

JSON リクエストでバインドしている 3 レベルの深さの階層があります。

Group -> Zone -> Segment
(1) -> (n) -> (n)

コマンドオブジェクトには次のものがあります。

class GroupCommand {
    Long id 
    Set zones

}

JSON リクエストをバインドすると、ゾーンが適切にバインドされ、プロパティを取得してドメイン オブジェクトで使用できる LinkedHashSet が取得されます。ただし、サービスのセグメントを反復処理すると、次のようになります。

groupCommand.zones.each { zone -> 
    zone.segments.each { segment ->
        //Would like to get LinkedHashMap here also
        //but get JSONArray
    }
}

上記のように、深くネストされたセグメントも LinkedHashMap にバインドするのが理想的ですが、JSONArray にバインドされています。

サービスで JSONArray を操作する必要がないようにして、それによってサービスを JSON 形式に結合することを避けたいので、それを LinkedHashMap にバインドする方法についての提案。

ゲッターを使用してコマンド レベルで変換を行う方法があれば、私もそれを支持します。

ありがとう

編集:

使用する

List zones = org.apache.commons.collections.list.LazyList.decorate(new ArrayList(), new org.apache.commons.collections.functors.InstantiateFactory(ZoneCommand.class))

動作しているように見えますが、基になるオブジェクトはまだ JSON 要素です。次に、使用してみました:

List<RateZoneCommand> zones = org.apache.commons.collections.list.LazyList.decorate(new ArrayList(), new org.apache.commons.collections.functors.InstantiateFactory(ZoneCommand.class))

少なくとも、変換しようとしているというエラーが表示されました。

Validation error: ... org.codehaus.groovy.grails.web.json.JSONArray to required type java.util.List for property zones; nested exception is java.lang.IllegalStateException: Cannot convert value of type [org..JSONObject] to required type [ZoneCommand] for property zones[0]: no matching editors or conversion strategy found.
4

1 に答える 1

2

各レベルのコマンド クラスを作成します。-and Zone- command を としてマークします。Segment@Validateable

GroupCommand、次を追加します。

List zones = org.apache.commons.collections.list.LazyList.decorate(new ArrayList(), new org.apache.commons.collections.functors.InstantiateFactory(ZoneCommand.class))

ZoneCommand、次を追加します。

List segments = org.apache.commons.collections.list.LazyList.decorate(new ArrayList(), new org.apache.commons.collections.functors.InstantiateFactory(SegmentCommand.class))

あなたのフォームでは、group.zones[0].segments[0]. コマンド クラスのフィールド タイプを変更した場合は、忘れずに grails サーバーを再起動してください。

于 2012-07-16T22:53:54.867 に答える