Spring Исключения CrudRepository
У меня есть этот Spring Data CrudRepository
, который обрабатывает операции CRUD в БД.
@Repository
public interface IUserRepository extends CrudRepository<User, String> {
}
User
- это таблица сущностей пользователя моей БД. CrudRepository
добавляет следующие операции в репозиторий:
-
delete(String ID)
-
findOne(String ID)
-
save(User user)
Как указано в документации , операции удаления и поиска throw IllegalArgumentException
в случае, если данный идентификатор равен null, в то время как операция сохранения не вызывает никаких исключений.
Проблема в том, что javadoc CrudRepository не упоминает о других исключениях, вызванных этими операциями. Например, он не говорит о том, что операция delete(String ID)
вызывает EmptyResultDataAccessException
, если предоставленный идентификатор не существует в БД.
В javadoc операции save(User user)
не выясняется, какие исключения выдаются, если вы вставляете нового пользователя, который нарушает одно ограничение целостности данных (по уникальным полям и внешним ключам). Кроме того, он не предупреждает вас, пишете ли вы нового или существующего пользователя: он просто создает нового пользователя или перезаписывает, если он существует (так что это операция "Вставка + обновление" ).
В корпоративном приложении я должен уловить каждое бросающееся исключение, которое может выполнить операция, и я должен прочитать об этом в операции javadoc.
Знаете ли вы какую-либо четкую документацию об исключениях CrudRepository?
Спасибо
Ответы
Ответ 1
Spring имеет встроенный механизм перевода исключений, так что все исключения, переданные поставщиками персистентности JPA, преобразуются в Spring DataAccessException - для всех beans, аннотированный с помощью @Repository (или настроенный).
Существует четыре основные группы -
-
NonTransientDataAccessException - это исключения, в которых повторение одной и той же операции завершится неудачно, если причина Исключения не будет исправлена. Поэтому, если вы передаете не существующий идентификатор, например, он завершится с ошибкой, если в базе данных не существует идентификатора.
-
RecoverableDataAccessException - это "противоположность" предыдущего - исключения, которые можно восстановить - после некоторых шагов восстановления. Подробнее в документах API
-
ScriptException - Исключения, связанные с SQL, при попытке обработать неверно сформированный script например.
-
TransientDataAccessException - это исключение, когда восстановление возможно без какого-либо явного шага, например. когда в базе данных есть тайм-аут, вы повторяетесь через несколько секунд.
Тем не менее, идеальное место для поиска документации обо всех исключениях - находится в самом API - просто перейдите по иерархии DataAccessException.