Grails验证错误从服务到控制器消失

Grails验证错误从服务到控制器消失,grails,groovy,gorm,Grails,Groovy,Gorm,在服务方法中执行自定义rejectValue时,grails会丢失服务方法和返回控制器之间的错误。这似乎是在更新行实例时发生的,而不是在创建行实例时发生的 在职 def specialValidation(petInstance){ if(petInstance.petType.requiresStateId && !petInstance.StateId){ petInstance.errors.rejectValue('StateId','

在服务方法中执行自定义rejectValue时,grails会丢失服务方法和返回控制器之间的错误。这似乎是在更新行实例时发生的,而不是在创建行实例时发生的

在职

def specialValidation(petInstance){
       if(petInstance.petType.requiresStateId && !petInstance.StateId){
           petInstance.errors.rejectValue('StateId','StateId required');
       }
       println petInstance.errors //shows 1 error
       return petInstance;

}
内部控制器

...
   petInstance.properties=params;
   petInstance=petService.specialValidation(petInstance);
   println petInstance.errors //shows 0 errors

当实例从服务转移到控制器时,错误是如何丢失的?

我做了一些类似的事情:

 orderService.validate(order, params)
 if (order.hasErrors()) {
      return render(view: 'create', model: [order: order])
}
在服务中,我执行以下验证:

if (end.before(start)) { 
        order.errors.rejectValue("end", '', 'ERROR');
}
与您的不同之处在于,我没有设置错误代码,而是设置了消息本身,请查看rejectValue方法:

void rejectValue(String field, String errorCode);
void rejectValue(String field, String errorCode, String defaultMessage);

你也可以像我一样尝试使用rejectValue方法,也许会有帮助。

这可能是因为事务性服务。服务为每个方法打开单独的事务,并在方法结束后清除实体。您可以在中找到(阅读第部分最后一段)


我也有同样的问题。然后我在验证方法中添加了
NotTransactional
注释,这很有帮助。已保存错误

我发现你也可以通过使用

 MyDomain.read(id)
而不是

MyDomain.get(id)

你能解决这个问题吗?