Grails 验证错误从服务到控制器消失
Grails validation errors disappear from service to controller
当我在服务方法中执行自定义 rejectValue 时,grails 会将服务方法和 return 之间的错误丢失给控制器。这似乎在更新行实例时发生,但在创建行实例时不会发生。
服役中
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 方法,也许会有帮助。
可能是因为交易服务。服务为每个方法打开单独的事务并在方法结束后清除实体。您可以在 docs(阅读部分的最后一段)
中找到此内容
我遇到了同样的问题。比我在验证方法中添加 NotTransactional
注释更有效。错误已保存。
我发现你也可以通过使用
来避免这种情况
MyDomain.read(id)
而不是
MyDomain.get(id)
当我在服务方法中执行自定义 rejectValue 时,grails 会将服务方法和 return 之间的错误丢失给控制器。这似乎在更新行实例时发生,但在创建行实例时不会发生。
服役中
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 方法,也许会有帮助。
可能是因为交易服务。服务为每个方法打开单独的事务并在方法结束后清除实体。您可以在 docs(阅读部分的最后一段)
中找到此内容我遇到了同样的问题。比我在验证方法中添加 NotTransactional
注释更有效。错误已保存。
我发现你也可以通过使用
来避免这种情况 MyDomain.read(id)
而不是
MyDomain.get(id)