【问题标题】:How to stop grails erasing custom validation errors如何停止 grails 擦除自定义验证错误
【发布时间】:2016-05-11 19:51:33
【问题描述】:

在我的 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

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

【问题讨论】:

  • 我将实例交给分析属性的服务。如果发现错误,我会添加它们... 问题为什么要将它传递给服务以分析属性并在服务中拒绝?当验证 bean 到达控制器时,您可以在验证 bean 中执行所有这些操作。在控制器中查看stackoverflow.com/questions/37121551/…,您调用验证 bean 进行验证,您只需调用 if (bean.validate()) { doSoemthing. inService.(bean) }
  • 另一种方法是让它抛出 IOException,如果它在服务中的这个位期间执行 DB 的东西 - 然后最后痛苦地包裹在控制器中的 try catch 中,然后在你的 catch 中是你的失败......或者将失败作为映射返回给控制器,然后在控制器中的服务中执行相同的验证失败,看看会产生什么差异。

标签: validation grails grails-orm


【解决方案1】:

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

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

希望对你有所帮助, 马特维。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-20
      • 2012-12-11
      • 1970-01-01
      相关资源
      最近更新 更多