2012-04-26 74 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中,這使得代碼更加清晰,因爲你不必在意任何驗證錯誤的字段中省略。