我正在尝试将 grails 参数映射解析为 Json 字符串,然后返回参数映射。 (用于保存违反约束的 html 表单条目)
只要参数映射中没有 hasMany 关系,一切都很好。
我正在使用
fc.parameter = params as JSON
将参数保存为 JSON 字符串。
后来我试图重建参数映射并用它创建一个新的域对象:
new Foo(JSON.parse(fc.parameter))
仅使用 1:1 关系(状态),一切都很好。
[states:2, listSize:50, name:TestFilter]
但是当我尝试使用多选值(状态)重建参数映射时
[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))
}
请您参考如下方法:
您可以使用 JsonSlurper 代替 grails 的 converters.JSON,它将 JSON 对象映射到 Groovy Maps。我认为 this链接也可能对您有所帮助。
编辑:现在,如果问题是将参数映射绑定(bind)到您的域,您应该尝试使用 bindData() 方法,例如:
bindData(foo, params)
请注意,仅当您在 Controller 内调用 bindData 时,才可以直接使用。
在您的情况下似乎正在发生的事情是 Grails 正在尝试将具体类型的 List (在 JsonSlurper 的情况下为 ArrayList 和在 converters.JSON 的情况下为 JSONArray )绑定(bind)到一组属性(这是默认数据结构一对多关联)。我将不得不查看您的代码以确认这一点。但是,正如您所做的替换状态:[1,2] 为您的应用程序的方法,尝试另一个测试来确认这个假设。改变:
states:[1,2]
为了
states:[1,2] as Set
如果这真的是问题,甚至 绑定(bind)数据() 作品,看看 this使用对象编码和 converters.JSON 以更难的方式使其工作。我不知道在你的项目中使用它是否实用,但它确实很好用;)




