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.