如何阻止 grails 清除自定义验证错误

How to stop grails erasing custom validation errors

在我的 Grails 应用程序中,我使用服务中的方法对用户提交的数据进行复杂的验证。不幸的是,Grails 正在悄悄地破坏我。

  1. 我用用户提交的数据填充域实例

  2. 我将实例交给分析属性的服务。

  3. 如果发现错误,我会使用

    添加它们
      instance.errors.rejectValue('myValue','errors.customErrorCode','Error') 
    
  4. 在幕后,当服务将域实例传递回控制器时,grails 检查更改的属性并在返回实例之前调用 validate()。 (可通过查看将域实例从服务返回到一个或多个属性已更改的控制器时调用的 beforeValidate 事件进行验证)

  5. 该行为清除了我添加的任何自定义错误,并且我在控制器中返回的实例现在不正确,没有错误。

我怎么能

A) 阻止 grails 在服务和控制器之间进行验证

B) 防止 validate() 调用清除我的自定义错误。

编辑 到目前为止,我找到了一个部分答案,

如果您使用 instance.get(params.id),grails 将在后台进行自我验证,清除自定义错误。

如果您使用 instance.read(params.id),您可以在一定程度上绕过此行为。docs

但是这个解决方案受到域关系的限制。欢迎任何其他解决方案。

不确定您的代码是什么样子或导致问题的原因,但无论如何我强烈建议在域 class 或约束内的命令对象中实现自定义验证器。

以下是 grails 文档中的一些示例: http://docs.grails.org/2.4.0/ref/Constraints/validator.html

好像不是自定义验证。这可能是因为交易服务。服务为每个方法打开单独的事务并在方法结束后清除实体。你可以在 docs 中找到这个(阅读部分的最后一段)。所以错误消失不是因为验证。

不知道您的服务是否是事务性的。但如果是 - 如果您不想丢失错误,则可以向方法添加 @NotTransactional 注释。和 错误将被保存。

希望对您有所帮助, 马特维