2012-04-26 65 views
2

我有一个需要有一个方法来返回Id的情况下成功和失败的错误列表。 前的代码片段:如何处理groovy Mehods中的多种返回类型?

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 。

回答

1

不要这样做 - 即使您可以使其对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称为方法的字段,但它们不是。

+0

Burt:我得到了你正在说的话,但是我必须返回自定义错误并且不在域上进行验证,因为我正在处理webservices,所以我可以将List错误作为save方法的一部分传递。像在服务def错误= []; service.save(id,name,no,errors)..因为错误是一个列表对象,不需要返回。 – 2012-04-26 05:20:15

+0

我建议打印错误以从服务内登录。除此之外,我完全同意。 – Chris 2012-04-26 08:50:22

+2

如果您绝对需要返回自己的错误,请使用地图或专用结果对象。作为Map:[id:employee.id,errors:myErrors] – loteq 2012-04-26 09:32:56

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 
} 

另外一个优点:当预期没有验证错误,try-catch块可以在Groovy中,这使得代码更加清晰,因为你不必在意任何验证错误的字段中省略。