我正在尝试将 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 以更难的方式使其工作。我不知道在你的项目中使用它是否实用,但它确实很好用;)


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!