【发布时间】:2016-05-11 19:51:33
【问题描述】:
在我的 Grails 应用程序中,我使用服务中的方法对用户提交的数据进行复杂的验证。不幸的是,Grails 正在悄悄地破坏我。
-
我用用户提交的数据填充域实例
-
我将实例交给分析属性的服务。
-
如果发现错误,我使用添加它们
instance.errors.rejectValue('myValue','errors.customErrorCode','Error') -
幕后,当服务将域实例传回控制器时,grails 检查更改的属性并在返回实例之前调用 validate()。(可通过查看返回时调用的 beforeValidate 事件来验证从服务到控制器的域实例,其中一个或多个属性已更改)
-
该行为清除了我添加的任何自定义错误,并且我在控制器中返回的实例现在不正确且没有错误。
我该怎么做
A) 阻止 grails 在服务和控制器之间进行验证
或
B) 防止 validate() 调用擦除我的自定义错误。
编辑 到目前为止,我找到了一个部分答案,
如果您使用 instance.get(params.id),grails 将在后台自行验证并清除自定义错误。
如果你使用 instance.read(params.id) 你可以在一定程度上绕过这个行为。docs
但是这个解决方案受到域关系的限制。欢迎任何其他解决方案。
【问题讨论】:
-
我将实例交给分析属性的服务。如果发现错误,我会添加它们... 问题为什么要将它传递给服务以分析属性并在服务中拒绝?当验证 bean 到达控制器时,您可以在验证 bean 中执行所有这些操作。在控制器中查看stackoverflow.com/questions/37121551/…,您调用验证 bean 进行验证,您只需调用 if (bean.validate()) { doSoemthing. inService.(bean) }
-
另一种方法是让它抛出 IOException,如果它在服务中的这个位期间执行 DB 的东西 - 然后最后痛苦地包裹在控制器中的 try catch 中,然后在你的 catch 中是你的失败......或者将失败作为映射返回给控制器,然后在控制器中的服务中执行相同的验证失败,看看会产生什么差异。
标签: validation grails grails-orm