これを行わないでください。Groovy でいくらか使いやすくすることができたとしても、それは悪い考えです。ただし、この場合、いくつかの簡単な解決策があります。Employee インスタンスを渡してサービス メソッドに保存するだけの場合は、何も返す必要はありません。
void save(Employee employee) {
employee.save(flush:true)
}
これは、成功した場合、渡したインスタンスに id が設定され、失敗した場合、errors
プロパティに 1 つ以上の検証エラーが発生するためです (実際に有用なエラー メッセージがある場合に、一般的なエラー メッセージを返す必要はありません)。エラー メッセージが表示されます)。
たとえば、これは、サービスを呼び出すコントローラーにあるコードです。
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
}
この 2 番目のケースでは、save
呼び出しとを分離することが重要return
です。検証エラーsave
が返さnull
れ、常に null 以外のインスタンスを返したい場合です。したがって、これを行わないでください:
return employee.save(flush:true)
それらを分離すると、エラーやIDを確認できます。
また、コードで使用しているようなクロージャーをサービスで使用しないdef save = { ...
ようにしてください ( )。Spring トランザクション処理は Groovy クロージャーを認識しないため、メソッドのみがトランザクションになります。それらは、Groovy がメソッドであるかのように呼び出す単なるフィールドですが、そうではありません。