Интерфейс с исключением расширяет интерфейс без исключения
сено,
У меня есть таблица пользователей с уникальным полем электронной почты, которое служит именем пользователя. Теперь, когда я дважды вызываю метод dao.create с одной и той же информацией, я получаю исключение org.springframework.dao.DataIntegrityViolationException (повторяющаяся запись....). Это подводит меня к моменту, когда я хочу, чтобы мой userDao.create(o) выдавал проверенное исключение. Теперь у меня проблема, что мой UserDao-Interface расширяет GenericDao-Interface, который уже определяет метод создания без предложения throw.
Поскольку расширяемый интерфейс не может генерировать больше исключений, чем интерфейс, который он расширяет, этот код не компилируется:
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 в Runtime-Exception и его документирование тоже не очень приятно, так как я хочу заставить пользователя метода поймать исключение и сообщить о нем конечному пользователю. Создание нового метода userDao.createUser(), который выдает Exeption и выдает UnsupportedOperationException с уже существующим методом userDao.create(), кажется мне самым аккуратным из всех решений, которые пришли мне на ум до сих пор. Я все еще хотел бы знать, как правильно решить эту проблему?
RuntimeException
или заставите вызывающую сторону поймать и обработать, это полностью зависит от семантики бизнес-логики этого исключения. - person Marko Topolnik   schedule 04.05.2012boolean create(T object)
и возвращать true, если создано успешно, и false, если пользователь уже существует. - person assylias   schedule 04.05.2012