2

成功した場合は Id を返し、失敗した場合はエラーのリストを返すメソッドが必要です。exコードスニペット:

def save = {
   def errors = []
    if(Employee.save(flush:true)){
      return Employee.id
    }else{
      errors.add("Can't be saved")
      return errors.
    }

   } 

サービス クラス ICalling Employee.save() では、save メソッドが返すのがエラーか ID かを確認する方法

周りの提案をいただければ幸いです。

4

2 に答える 2

2

Burk が異なる型を返さないことに同意します。予期しないエラーが発生する可能性があります。この問題に対する別の解決策は、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
}

追加の利点: 検証エラーが予想されない場合、Groovy で try-catch ブロックを省略することができます。これにより、検証エラー フィールドを気にする必要がないため、コードが簡潔になります。

于 2012-04-26T09:26:28.343 に答える
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
}

新しいインスタンスを作成して保存し、従業員を返すためにデータを渡したい場合 (これは私が通常取るアプローチです)、それは似ています:

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 がメソッドであるかのように呼び出す単なるフィールドですが、そうではありません。

于 2012-04-26T04:58:48.477 に答える