【发布时间】:2011-12-13 15:15:06
【问题描述】:
我有一个这样的 Grails 域:
class User {
....
Address address
}
在保存用户的同时,我还想验证地址对象并将地址对象的所有错误添加到用户对象本身。
我正在尝试编写一个自定义验证器,其中我执行it.validate(),但我无法找到一种方法来“添加”地址的错误消息。
【问题讨论】:
标签: java validation grails error-handling
我有一个这样的 Grails 域:
class User {
....
Address address
}
在保存用户的同时,我还想验证地址对象并将地址对象的所有错误添加到用户对象本身。
我正在尝试编写一个自定义验证器,其中我执行it.validate(),但我无法找到一种方法来“添加”地址的错误消息。
【问题讨论】:
标签: java validation grails error-handling
下面的讨论在 grails 邮件列表中关于调用子对象的验证并将它们附加到可能对您有用的单个错误列表中。
如果 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>
【讨论】:
由于这可能是与前端相关的任务,因此我不会尝试摆弄那些错误类。我建议您在自定义验证器中调用 validate 函数,如下所示:
address(validator: { val, obj ->
val?.validate();
});
在 GUI 中,您将在嵌套域类的实例中找到嵌套域类的错误消息。因此,您需要将域类传递给 GSP。
<g:renderErrors bean="${address}" field="street" />
但是,如果您真的想获得一个在所有嵌套类中包含所有错误的新集合,您可以查看插件http://www.grails.org/plugin/extended-validation。使用此插件,您有一个额外的错误集,其中包含嵌套域类的所有错误消息(如果它被配置为这样做):
user.allErrorsRecursive()
但说实话,我还没有测试过;)
【讨论】: