我需要有一个方法,以便在成功时返回Id,并在失败的情况下返回错误列表。 ex code snippet:
def save = {
def errors = []
if(Employee.save(flush:true)){
return Employee.id
}else{
errors.add("Can't be saved")
return errors.
}
}
在服务类中 ICalling Employee.save() - ..所以如何检查是否是保存方法返回的错误或id
任何建议都将受到赞赏。
答案 0 :(得分:2)
我同意Burk不返回不同的类型,它可能导致意外错误。 该问题的另一个解决方案是使用Java的异常处理机制。您可以向Exception添加一个上下文字段,该字段将包含验证错误列表。捕获异常后,您可以提取错误。
void save(Employee employee) {
// do save
// ...
// on error:
def errors = [ "terrible error nr. 5" ]
throw new ValidationException(errors)
}
try {
fooService.save(employee)
} catch(ValidationException e) {
def errors = e.erorrs
// do stuff with the errors
}
另一个优点:当没有预期的验证错误时,可以在Groovy中省略try-catch块,这样可以使代码更清晰,因为您不必关心任何验证错误字段。
答案 1 :(得分:1)
不要这样做 - 即使你可以使用Groovy更有用,这是一个坏主意。但在这种情况下,有一些简单的解决方案。如果您只是传递Employee实例并将其保存在服务方法中,则无需返回任何内容:
void save(Employee employee) {
employee.save(flush:true)
}
这是因为如果成功,将在您传入的实例上设置id,如果不成功,则errors
属性中将存在一个或多个验证错误(您无需返回有可用的实际有用错误消息时的通用错误消息。
例如,这将是您在调用服务的控制器中拥有的代码:
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(这是我通常采用的方法),它就是类似的:
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调用的字段,就像它们是方法一样,但它们不是。