0

例外のあるインターフェイスは、例外なしでインターフェイスを拡張します

ヘイ、

ユーザー名として機能する一意のフィールド email を持つ User-Table があります。同じ情報で dao.create メソッドを 2 回呼び出すと、org.springframework.dao.DataIntegrityViolationException (Duplicate entry....) が発生します。これにより、userDao.create(o) でチェック済み例外をスローする必要があるポイントに到達します。今、私は UserDao-Interface が GenericDao-Interface を拡張するという問題を抱えています。これは、throw-clause なしで create メソッドを既に定義しています。

拡張するインターフェイスは、拡張しているインターフェイスよりも多くの例外をスローできないため、このコードはコンパイルされません。

public interface GenericDao<T, PK extends Serializable> {
    /...
    T create(T object);
    /...
}

public interface UserDao extends GenericDao<User, Long> {
        /...
    User create(User user) throws UserExistsException;
    /...
}

(これが原因である理由については、Java インターフェイスが質問を拡張する(cletus からの回答) を参照してください)

今私の質問: この問題を解決するためのベスト プラクティスは何ですか?

事前にご回答いただきありがとうございます=)


PS: これまでのところ、私はいくつかの答えを思いつきましたが、それらは私を本当に満足させるものではありません. 1 つには、GenericDao にチェック例外をスローさせることができますが、テーブルの約 99% には (pk 以外の) 一意のフィールドがないため、これは受け入れられません。UserExistsException を Runtime-Exception にして文書化するのは、メソッドのユーザーに強制的に例外をキャッチさせてエンドユーザーに報告させたいため、あまりうまくいきません。Exeption をスローする新しい userDao.createUser() メソッドを作成し、既存の userDao.create() メソッドで UnsupportedOperationException をスローすることは、これまでに頭に浮かんだすべてのソリューションの中で最も整然としたものであることがわかりました。私はまだ知りたいのですが、この問題を解決する適切な方法は何ですか?

4

1 に答える 1

1

私は提案します:

public interface GenericDao<T, PK extends Serializable> {
    /...
    T create(T object) throws DaoException;
    /...
}

DaoException は (おそらく抽象) クラスであり、UserExistsException は DaoException を拡張します。

于 2012-05-04T09:14:06.067 に答える