【问题标题】:Grails, create domain object from json-string with has-many relationGrails,从具有多关系的json字符串创建域对象
【发布时间】:2012-07-09 16:10:18
【问题描述】:

我正在尝试将 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))
}

【问题讨论】:

    标签: json parsing grails parameters


    【解决方案1】:

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

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

    bindData(foo, params)
    

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

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

    states:[1,2]
    

    states:[1,2] as Set
    

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

    【讨论】:

    • 您好,使用 JsonSlurper 导致此异常:无法将 java.util.ArrayList 类型的属性值转换为属性状态所需的 java.util.Set 类型;嵌套异常是 java.lang.IllegalStateException:无法将类型 [java.lang.String] 的值转换为属性状态 [0] 所需的类型 [de.gotosec.approve.State]:找不到匹配的编辑器或转换策略 ---为什么需要域类而不是 id?
    • 如果你从对象的构造函数之外调用 parse 方法,你仍然得到同样的错误吗?还是对象绑定错误?
    • 它是一个对象绑定错误。解析没有问题。它返回一个 Hashmap,其中 states 是一个 ArrayList 和 1 个和 2 个字符串。
    • 如果我用 State.getAll(map.get('states') as List) 替换哈希图中的 'states:[1,2]' 条目,一切都很好,但为什么我必须这样做吗?在脚手架保存操作中,域对象是使用像“状态:[1,2]”这样的哈希映射结构构建的,为什么它会失败?
    • bindData 和 Set 强制转换都不起作用,强制转换为 Set 会导致异常:无法将 java.util.HashSet 类型的属性值转换为属性状态所需的 java.util.Set 类型;嵌套异常是 java.lang.IllegalStateException:无法将类型 [java.lang.Integer] 的值转换为属性状态 [0] 所需的类型 [de.gotosec.approve.State]:找不到匹配的编辑器或转换策略
    猜你喜欢
    • 2015-05-23
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多