不要這樣做 - 即使您可以使其對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