2015-09-24 60 views
2

当我在服务方法中自定义rejectValue时,grails失去了服务方法和返回控制器之间的错误。这似乎在更新行实例时发生,但在创建行时不会发生。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 

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

+0

你能解决问题避免这种情况? – iberck

回答

2

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

我有同样的问题。比我已经添加NotTransactional注释验证方法,并且它帮助。错误已保存。

1

嗯,我做了一件simular:

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); 

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

0

我发现你还可以通过使用

MyDomain.read(id) 

代替

MyDomain.get(id)