2

I'm trying to parse a grails parameter map to a Json String, and then back to a parameter map. (For saving html form entries with constraint-violations)

Everything is fine as long as there is no hasMany relationship in the parameter-map.

I'm using

fc.parameter = params as JSON

to save the params as JSON String.

Later I'm trying to rebuild the parameter map and create a new Domain-Object with it:

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

Everything is fine using only 1:1 relationships (states).

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

But when I try to rebuild a params-map with multi-select values (states)

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

I'm getting this 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

I tried to use this, but without success:

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

1 回答 1

0

您可以使用 JsonSlurper 代替 grails 的 converters.JSON,它将 JSON 对象映射到 Groovy Maps。我认为链接也可能对您有所帮助。

编辑:现在,如果问题是将参数映射绑定到您的域,您应该尝试使用 bindData() 方法,例如:

bindData(foo, params)

请注意,仅当您在控制器内调用 bindData 时,才可以直接使用。

在您的情况下似乎正在发生的事情是 Grails 正在尝试将具体类型的 List(在 JsonSlurper 的情况下为 ArrayList ,在 converters.JSON 的情况下为 JSONArray )绑定到一组属性(这是默认数据结构一对多关联)。我将不得不查看您的代码以确认这一点。但是,正如您所做的替换状态:[1,2] 为您的应用程序的方法,尝试另一个测试来确认这个假设。改变:

states:[1,2]

为了

states:[1,2] as Set

如果这确实是问题所在,甚至bindData() 都不起作用,请查看这个以使用对象编组和转换器.JSON 使其工作的更困难的方法。我不知道在你的项目中使用它是否实用,但它确实很好用;)

于 2012-07-09T18:24:57.283 回答