在我的Grails应用程序中,我使用服务中的方法对用户提交的数据进行复杂的验证。不幸的是,Grails正在悄悄地破坏我。
如果发现错误,请使用
添加 instance.errors.rejectValue('myValue','errors.customErrorCode','Error')
在幕后,当服务将域实例传递回控制器时,grails会检查更改的属性,并在返回实例之前调用validate()。(通过查看beforeValidate事件可验证)调用将域实例从服务返回到控制器,其中一个或多个属性已更改)
该行为会清除我添加的任何自定义错误,而我在控制器中返回的实例现在错误地没有错误。
我怎么能
A)阻止grails在服务和控制器之间进行验证
OR
B)阻止validate()调用擦除我的自定义错误。
修改 到目前为止,我找到了一个部分答案,
如果你使用instance.get(params.id),grails会在后台自我验证,擦除自定义错误。
如果您使用instance.read(params.id),则可以在一定程度上绕过此行为。docs
但是这个解决方案受到域关系的限制。欢迎任何其他方案。
答案 0 :(得分:0)
不确定代码的样子或导致问题的原因,但无论如何我强烈建议在域类或约束内的命令对象中实现自定义验证器。
以下是grails docs中的一些示例: http://docs.grails.org/2.4.0/ref/Constraints/validator.html
答案 1 :(得分:0)
似乎不是自定义验证。这可能是因为交易服务。服务为每个方法打开单独的事务,并在方法结束后清除实体。你可以在docs中找到这个(阅读部分的最后一段)。所以错误消失不是因为验证。
不知道您的服务是否是交易性的。但如果是 - 您可以向方法添加@NotTransactional
注释,如果您不想丢失错误。和
错误将被保存。
希望它有所帮助, 马特维。