これをしないでください。たとえ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
}
(この私は通常取るアプローチ)がある、それは似ています:この第2のケースで
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
戻りがある場合ので、それは、save
コールとreturn
を分離することが重要ですnull
であり、常にnull以外のインスタンスを返す必要があります。だからこれをしないでください:
return employee.save(flush:true)
あなたがそれらを分離すると、エラーやIDを確認することができます。
あなたのコード(def save = { ...
)のようなサービスでクロージャを使用しないようにしてください。 Springトランザクション処理はGroovyのクロージャについて知らないので、メソッドだけがトランザクションになります。それらはメソッドであるかのようにGroovyが呼び出すフィールドですが、そうではありません。
バート:私はあなたが言っているが、カスタムエラーを返し、私はwebservicesに取り組んでいるので、ドメインで検証をしていないので、私は保存方法の一部としてリストエラーを渡すことができます。サービスと同様def errors = []; service.save(id、name、no、errors)..エラーはリストオブジェクトなので返す必要はありません。 –
サービス内からログを出力することを推奨します。それのほかに私は完全に同意します。 – Chris
エラーを絶対に返す必要がある場合は、Mapまたは専用の結果オブジェクトを使用してください。マップとして:[id:employee.id、errors:myErrors] – loteq