【问题标题】:Grails nested domains - addAll errors to top level domain objectGrails嵌套域 - 将所有错误添加到顶级域对象
【发布时间】:2011-12-13 15:15:06
【问题描述】:

我有一个这样的 Grails 域:

class User {
....
Address address
}

在保存用户的同时,我还想验证地址对象并将地址对象的所有错误添加到用户对象本身。

我正在尝试编写一个自定义验证器,其中我执行it.validate(),但我无法找到一种方法来“添加”地址的错误消息。

【问题讨论】:

    标签: java validation grails error-handling


    【解决方案1】:

    下面的讨论在 grails 邮件列表中关于调用子对象的验证并将它们附加到可能对您有用的单个错误列表中。

    Form validation with children

    如果 Address 有static belongsTo = [user:User],那么调用 User.validate() 或 User.save() 也应该调用 Address 上的验证。我没有尝试将子对象上的错误收集到父对象的错误列表中,但是对于简单的一对一关联,您可能不需要这样做,只需像这样显示错误:

    <g:if test="${user?.hasErrors() || user.address?.hasErrors()}">
      <div class="errors">
        <g:hasErrors bean="${user}">
           <g:renderErrors bean="${user}" as="list" />
        </g:hasErrors>
        <g:hasErrors bean="${user?.address}">
           <g:renderErrors bean="${user?.address}" as="list" />
        </g:hasErrors>
      </div>
    </g:if>
    

    【讨论】:

    • 实际上我最终为地址设置了一个验证器 - address(validator: { val, obj -> val?.validate(); }); .. 然后用上面的 替换
    【解决方案2】:

    由于这可能是与前端相关的任务,因此我不会尝试摆弄那些错误类。我建议您在自定义验证器中调用 validate 函数,如下所示:

    address(validator: { val, obj ->
       val?.validate();
    });
    

    在 GUI 中,您将在嵌套域类的实例中找到嵌套域类的错误消息。因此,您需要将域类传递给 GSP。

    <g:renderErrors bean="${address}" field="street" />
    

    但是,如果您真的想获得一个在所有嵌套类中包含所有错误的新集合,您可以查看插件http://www.grails.org/plugin/extended-validation。使用此插件,您有一个额外的错误集,其中包含嵌套域类的所有错误消息(如果它被配置为这样做):

    user.allErrorsRecursive()
    

    但说实话,我还没有测试过;)

    【讨论】:

      猜你喜欢
      • 2011-11-23
      • 2016-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多