2016-09-22 22 views
0

私は春のMVCアプリケーションに取り組んでいます。私はDAO、サービス、コントローラを持っています。 Daoでは、SQLの行セットを返すようにデータベースを照会するメソッドがあります。私はSQL行セットが空であることをチェックしています。それがあれば、ランタイム例外をスローします。また、アプリケーションのロジックによれば、データベースへのクエリは、少なくとも1つの行を返す必要があります。だから、基本的には、私は空のSQL行セットを取得し、次にいくつかの問題があると仮定している、データベースが壊れているか類似している可能性があります。データベース例外の処理

これは、不明な例外をチェックする正しい方法ですか?それとも、サービスにSQL行セットを返す必要がありますか?サービスがこのSQL行セットを使用すると、NULLポインタ例外が発生する可能性があります。

私はdaoで例外をスローした場合、テストケースでその部分をカバーすることはできません。私はこのコードが例外処理部分を実行してテストするためにdbを一貫性のない状態にする必要があることを意味します。

+0

http://stackoverflow.com/questions/6546875/collections-emptylist-instead-of-ヌルチェック –

答えて

1

DAOレイヤーは、ビジネスルールには関係しません。データ操作を抽象化して、サービスレイヤがデータの保存方法や場所を意識する必要はありません。

私の意見では、DAOは単に空の結果セットを返さなければなりません。空の結果セットで何をすべきかを知るためには、サービスに依存します。なぜなら、サービスレイヤでは、通常、ビジネスロジックが格納されている場所なのでです。

1

いいえ、もっと一般的には、今のところ状況や要件がないため、アプリケーションに制限を導入しないでください。データベースに行がない場合は、データベースが空の状態になっている可能性があります。または、そのスキーマでテストを行っている可能性があります。現在は空です。あなたはそれを行うことによってDAOの懸念を犯す。

さらに、データベースについて心配する必要はありません。それは意味がありません。あなたが働いているツールが正しく機能していることを受け入れることができない場合は、何も構築することができません。あなたは、データベースの例外を処理したい場合は、これらの例外をキャッチし、エラーメッセージを示す図にリダイレクトコントローラを持っている:

@ControllerAdvice 
public class ErrorHandler { 
    @ExceptionHandler(DataAccessException.class) 
    public String handleDatabaseException(DataAccessException ex) { 
     return "error"; 
    } 

    @ExceptionHandler(CannotCreateTransactionException.class) 
    public String handleAccessException(CannotCreateTransactionException ex) { 
     return "database_error"; 
    } 
}