2012-04-26 11 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. 
    } 

    } 

Serviceクラス ICalling Employee.save(中) - それは方法が

任意の提案は、周りいただければ幸い返しセーブエラーやidがある場合..ので、どのようにチェックします。

答えて

1

これをしないでください。たとえ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が呼び出すフィールドですが、そうではありません。

+0

バート:私はあなたが言っているが、カスタムエラーを返し、私はwebservicesに取り組んでいるので、ドメインで検証をしていないので、私は保存方法の一部としてリストエラーを渡すことができます。サービスと同様def errors = []; service.save(id、name、no、errors)..エラーはリストオブジェクトなので返す必要はありません。 –

+0

サービス内からログを出力することを推奨します。それのほかに私は完全に同意します。 – Chris

+2

エラーを絶対に返す必要がある場合は、Mapまたは専用の結果オブジェクトを使用してください。マップとして:[id:employee.id、errors:myErrors] – loteq

2

私はバークに異なるタイプを返さないことに同意すると、予期しないエラーが発生する可能性があります。 この問題のもう1つの解決策は、Javaの例外処理メカニズムを使用することです。検証フィールドのリストを保持する例外フィールドにコンテキストフィールドを追加することができます。例外をキャッチした後、エラーを抽出することができます。

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、に含まれませできます。

関連する問題