2

grailsパラメーターマップをJson文字列に解析してから、パラメーターマップに戻そうとしています。(制約違反のあるhtmlフォームエントリを保存する場合)

パラメータマップにhasMany関係がない限り、すべて問題ありません。

使っています

fc.parameter = params as JSON

パラメータをJSON文字列として保存します。

後で、パラメータマップを再構築し、それを使用して新しいドメインオブジェクトを作成しようとしています。

new Foo(JSON.parse(fc.parameter))

1:1の関係(状態)のみを使用して、すべてが正常です。

[states:2, listSize:50, name:TestFilter]

しかし、複数選択値(状態)を使用してparams-mapを再構築しようとすると

[states:[1,2], listSize:50, name:TestFilter]

私はこのIllegalStateExceptionを取得しています:

Failed to convert property value of type org.codehaus.groovy.grails.web.json.JSONArray to required type java.util.Set for property states; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [de.gotosec.approve.State] for property states[0]: no matching editors or conversion strategy found

私はこれを使おうとしましたが、成功しませんでした:

JSON.use("deep") {
   new Foo(JSON.parse(fc.parameter))
}
4

1 に答える 1

0

grails の converters.JSON の代わりに JsonSlurper を使用できます。JSON オブジェクトを Groovy Maps にマップします。このリンクも役立つと思います。

編集: 問題が params マップをドメインにバインドしている場合は、次のような bindData() メソッドを使用してみてください。

bindData(foo, params)

この単純な使用法は、コントローラー内で bindData を呼び出している場合のみであることに注意してください。

あなたのケースで起こっているように見えるのは、Grailsが具体的なタイプのリスト(JsonSlurperの場合はArrayList、converters.JSONの場合はJSONArray)を一連のプロパティ(のデフォルトのデータ構造)にバインドしようとしているということです1 対多の関連付け)。それを確認するには、コードを確認する必要があります。ただし、states: [1,2] をアプリのメソッドに置き換えたように、この仮説を確認するために別のテストを試してください。変化する:

states:[1,2]

為に

states:[1,2] as Set

これが本当に問題で、bindData()でさえ機能しない場合は、これを見て、オブジェクトのマーシャリングと converters.JSON を使用して機能させるより難しい方法を調べてください。あなたのプロジェクトでそれを使用することが実用的かどうかはわかりませんが、うまく機能することは確かです ;)

于 2012-07-09T18:24:57.283 に答える