【发布时间】:2015-03-06 20:56:37
【问题描述】:
我试图从与 Grails 中的域对象交互时引发的异常中确定错误代码是什么。
我有一个具有一些字段验证的数据库,其中一个验证是特定列必须是唯一的。根据文档,它将给出className.propertyName.unique(http://grails.org/doc/latest/ref/Constraints/unique.html) 的错误代码。当我将控制器包装在 try catch 块中时。我可以这样捕获各种验证异常:
catch (grails.validation.ValidationException e) {
exception handling code here
}
如何访问错误代码?我想做If the Error Code = className1.propertyName2.unique之类的事情,然后回复propertyName2 is not unique。
当我执行保存操作时,我确实将“failOnError: true”设置为参数。
谢谢!
【问题讨论】:
-
只需在
messages.properties文件中添加className1.propertyName2.unique=propertyName2 is not unique,grails 你工作了吗?不需要捕获。 -
我现在没有时间详细介绍并给您一个超级棒的答案,但是,简短而肮脏的答案是,当您尝试保存
domain object它失败了,它会悄悄地这样做,但你应该在里面有一个叫做errors的东西,它会给你错误。它看起来像这样: def domainObject = new DomainObject(params) if(!domainObject.save()){ domainObject.each{ print(it) } } 这又快又脏而且不完整,但应该让你得到你想要的需要。 -
e.getErrors().getFieldError() 是一个包含 20 个错误的数组,其中一项是文档中的错误代码。如果那里存在错误代码,我是否应该每次都检查该数组? --- @user1690588 我的messages.properties 中确实有这个设置。即使我检查了数组并将其打印出来,它也不会将其从 lassName1.propertyName2.unique 更改为 propertyName2 is not unique --- TedDelezene,我设置了它如果它不起作用,就会失败。你知道是否有例外的方法吗?
-
在捕获异常后,您可能仍然在原始域对象中拥有错误列表,因此您应该能够以相同的方式处理内部错误
domainObject.errors.each{ render it }或任何您想用它做的事情...或者您可以使用相同的技术在错误时抛出您自己的异常,但我通常不会那样处理它,通常如果一个对象没有正确保存,我会渲染一个特定的模板来枚举来自我使用eachError tag(grails.org/doc/latest/ref/Tags/eachError.html)传递给它的域对象 -
感谢您的帮助,我最终基本上做到了(见下面的帖子)
标签: grails grails-orm unique-constraint grails-domain-class grails-validation