2

我需要有一个方法来在成功的情况下返回 Id,在失败的情况下返回错误列表。前代码片段:

def save = {
   def errors = []
    if(Employee.save(flush:true)){
      return Employee.id
    }else{
      errors.add("Can't be saved")
      return errors.
    }

   } 

在服务类 ICalling Employee.save() - .. 那么如何检查 save 方法返回的是错误还是 id

任何建议将不胜感激。

4

2 回答 2

2

我同意 Burk 不要返回不同的类型,这可能会导致意外错误。该问题的另一个解决方案是使用 Java 的异常处理机制。您可以将上下文字段添加到将保存验证错误列表的异常。捕获异常后,您可以提取错误。

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 块,这使代码更简洁,因为您不必关心任何验证错误字段。

于 2012-04-26T09:26:28.343 回答
1

不要这样做——即使你可以让它在 Groovy 中更有用,这也是个坏主意。不过,在这种情况下,有一些简单的解决方案。如果您只是传递 Employee 实例并将其保存在 service 方法中,则无需返回任何内容:

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在第二种情况下,将call 和分开很重要return,因为如果save返回验证错误null并且您希望始终返回非 null 实例。所以不要这样做:

return employee.save(flush:true)

如果将它们分开,则可以检查错误和/或 ID。

此外,请确保不要在代码中那样在服务中使用闭包 ( def save = { ...)。只有方法是事务性的,因为 Spring 事务处理不知道 Groovy 闭包——它们只是 Groovy 调用的字段,就好像它们是方法一样,但它们不是。

于 2012-04-26T04:58:48.477 回答