0

带异常的接口无异常扩展接口

干草,

我有一个带有唯一字段电子邮件的用户表,用作用户名。现在,当我使用相同的信息两次调用 dao.create 方法时,我得到一个 org.springframework.dao.DataIntegrityViolationException(重复条目......)。这让我明白了,我希望我的 userDao.create(o) 抛出一个已检查的异常。现在我遇到了问题,我的 UserDao-Interface 扩展了 GenericDao-Interface,它已经定义了没有 throw 子句的 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:到目前为止,我想出了几个答案,这并不能真正让我满意。一方面,我可以让 GenericDao 抛出一个检查异常,但由于大约 99% 的表没有唯一字段(除了 pk),这是不可接受的。使 UserExistsException 成为运行时异常并记录它也不是很好,因为我想强制该方法的用户捕获异常并将其报告给最终用户。创建一个抛出 Exeption 的新 userDao.createUser()-method 并使用已经存在的 userDao.create()-method 抛出 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 回答