不要这样做 - 即使您可以使其对Groovy更有用,但这不是一个好主意。在这种情况下,有几个简单的解决方案。如果你只是路过的Employee实例并保存在服务方法,你不需要任何回报:
void save(Employee employee) {
employee.save(flush:true)
}
这是因为,如果成功,该ID将在您通过实例设置如果不存在,那么errors
属性中将存在一个或多个验证错误(当有实际有用的错误消息可用时,不需要返回一般错误消息)。
例如,这将是你不得不在控制器调用服务的代码:如果你想在数据传递到创建并保存新的实例,并返回一个Employee
def employee = new Employee(...)
fooService.save(employee)
if (employee.hasErrors()) {
// do something with employee.errors
}
else {
// success - use the id if you need via employee.id
}
(此是我通常采取的方法),它类似于:
Employee save(String name, int foo, boolean bar, ...) {
Employee employee = new Employee(name: name, foo: foo, bar: bar, ...)
employee.save(flush:true)
return employee
}
在第二种情况下它分开save
调用和return
,是非常重要的,因为如果有一个验证错误save
回报null
,并且您希望始终返回一个非null实例。所以不要这样做:
return employee.save(flush:true)
如果你将它们分开,你可以检查错误和/或ID。
此外,请确保您的不是在您的代码(def save = { ...
)中使用的服务中使用闭包。由于Spring事务处理不知道Groovy闭包,所以只有方法是事务性的 - 它们只是Groovy称为方法的字段,但它们不是。
Burt:我得到了你正在说的话,但是我必须返回自定义错误并且不在域上进行验证,因为我正在处理webservices,所以我可以将List错误作为save方法的一部分传递。像在服务def错误= []; service.save(id,name,no,errors)..因为错误是一个列表对象,不需要返回。 – 2012-04-26 05:20:15
我建议打印错误以从服务内登录。除此之外,我完全同意。 – Chris 2012-04-26 08:50:22
如果您绝对需要返回自己的错误,请使用地图或专用结果对象。作为Map:[id:employee.id,errors:myErrors] – loteq 2012-04-26 09:32:56