【问题标题】:Grails bind data to non-domain-class with type checkingGrails 通过类型检查将数据绑定到非域类
【发布时间】:2016-06-06 11:34:26
【问题描述】:

我正在寻找一种简单的方法来检查我的参数中的某些类型。如果它们存在,它们应该具有某种类型,否则它们应该具有默认值。如果它们存在并且它们的类型错误,则应该抛出异常。

之后将值放在方便的容器中会很好。因此,我尝试将params 传递给容器的构造函数,并将bindData 传递给容器对象。两者都不成功:

class ContainerClass {
     Integer foo = 42;
}

class TestController {

    def index(){
         //doesn't throw, **even when params.foo = "2asdf3"**
         ContainerClass meh = new ContainerClass();
         bindData(meh, params);

         println meh.foo //prints 42 when params.foo = "2asdf3"

         // throws GroovyCastException: Cannot cast object '23' with class
         // 'java.lang.String' to to class 'java.lang.Integer',
         // **even when params.foo = "23"**
         ContainerClass meh2 = new ContainerClass(params);
         render "meh"
    }
}

如果这很重要,我正在使用 grails 3。

【问题讨论】:

    标签: grails data-binding grails-3.0


    【解决方案1】:

    您可以使用命令对象将参数绑定到某些数据类型。 参考:http://docs.grails.org/latest/guide/single.html?utm_content=bufferf77f5&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer#commandObjects

    如果您想在某些数据类型不匹配时抛出异常,则需要明确检查。

    【讨论】:

    • 也可以抛出异常——从简单的约束验证器到特定的grails.databinding.converters.ValueConverter。有关如何执行此操作的详细信息,请参阅文档的数据绑定部分。
    • 好吧,我现在不能不接受这个答案,这几乎是我需要的,所以没关系。但有一些警告:1)默认值是不可能的。如果缺少某个属性,hasErrors 将返回 true,即使它设置了默认值 2) 通过 JSON 发送数据时,似乎只有多个 CommandObject 中的第一个被初始化。第二个大概只看到一个空的 JSONObject 并且失败了。
    • 您能否详细说明第二点?举个例子?对于第 1 点,您可以覆盖 getter 并进行相应修改。
    • 对于 2):假设我有两个命令对象 FooBar。在一个动作中,我可以同时传递它们:myAction(Foo foo, Bar bar){...}(至少文档是这样说的)。当将 JSON 传递给操作时,foo 将被初始化,bar 不会。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多