我正在尝试将grails参数映射解析为Json String,然后返回参数映射。 (用于保存具有约束违规的html表单条目)
只要参数映射中没有hasMany关系,一切都很好。
我正在使用
fc.parameter = params as JSON
将params保存为JSON String。
稍后我正在尝试重建参数映射并用它创建一个新的Domain-Object:
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))
}
答案 0 :(得分:0)
您可以使用JsonSlurper而不是grails的converter.JSON,它将JSON对象映射到Groovy Maps。我认为this链接也可能对您有所帮助。
编辑:现在,如果问题是将params映射绑定到您的域,您应该尝试使用bindData()方法,如:
bindData(foo, params)
请注意,只有在控制器内调用bindData时才能直接使用。
在您的情况下似乎正在发生的事情是Grails正在尝试将一个具体类型的List(在JsonSlurper的情况下为ArrayList,在converter.JSON的情况下为JSONArray)绑定到一组属性(这是默认值)一对多关联的数据结构)。我将不得不看看你的代码来确认。但是,正如您所做的那样,替换状态:[1,2]为您的应用程序的方法,尝试另一个测试来确认这个假设。变化:
states:[1,2]
代表
states:[1,2] as Set
如果这确实是问题而且 bindData()无效,请查看this以了解使用对象编组和converter.JSON更难的方法。我不知道你在项目中使用它是否实用,但它确实很好用;)