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

时间:2015-09-24 17:27:40

标签: grails groovy gorm

当我在服务方法中执行自定义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

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

3 个答案:

答案 0 :(得分:2)

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

我遇到了同样的问题。比我已经为验证方法添加了NotTransactional注释,它有所帮助。错误得救了。

答案 1 :(得分:1)

我做了类似的事情:

 orderService.validate(order, params)
 if (order.hasErrors()) {
      return render(view: 'create', model: [order: order])
}

在服务中我做了一些验证:

if (end.before(start)) { 
        order.errors.rejectValue("end", '', 'ERROR');
}

与你的不同之处在于我没有设置errorCode但是消息本身,请查看rejectValue方法:

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

您也可以尝试使用像我这样的rejectValue方法,也许有帮助。

答案 2 :(得分:0)

我发现你也可以通过

来避免这种情况
 MyDomain.read(id)

而不是

MyDomain.get(id)