Я работаю над проектом с использованием Spring Data-JPA. Мне нужно обрабатывать некоторые исключения в вызовах метода JpaRepository.Обработка данных об исключении весны
В нижеследующем коде мне нужно перехватить ошибки первичного ключа, но я не могу поймать исключение напрямую. В моем случае, когда возникает исключение такого рода, исключение UnexpectedRollbackException выбрано уровнем репозитория (JpaRepository). Мне нужно искать внутри этого объекта исключения, чтобы определить, в чем причина проблемы.
Мне интересно, есть ли более «изящный» способ достичь этого.
public Phone insert(Phone phone) throws BusinessException {
Phone result = null;
try{
result = phoneRepository.save(phone);
}
catch(UnexpectedRollbackException ex){
if((ex.getCause() != null && ex.getCause() instanceof RollbackException) &&
(ex.getCause().getCause() != null && ex.getCause().getCause() instanceof PersistenceException) &&
(ex.getCause().getCause().getCause() != null && ex.getCause().getCause().getCause() instanceof ConstraintViolationException)){
throw new BusinessException("constraint violation", ex);
}
}
catch(Exception ex){
throw new OuvidorNegocioException("unknown error", ex);
}
return result;
}
Спасибо!
UPDATE:
код ниже, кажется, гораздо лучше.
public Phone insert(Phone phone) throws BusinessException {
Phone result = null;
try{
result = phoneRepository.save(phone);
}
catch(UnexpectedRollbackException ex){
if(ex.getMostSpecificCause() instanceof SQLIntegrityConstraintViolationException){
throw new BusinessException("constraint violation", ex);
}
}
catch(Exception ex){
throw new OuvidorNegocioException("unknown error", ex);
}
return result;
}
Я не согласен с этим подходом. Пусть исключение из источника данных исключает исключение из списка данных Spring и позволяет ему обрабатывать служебный/бизнес-уровень. Вы отправляете меньше информации, поймав и повторно бросив таким образом. – duffymo
Hummm ... Я действительно так не думаю. Этот код уже находится в моем бизнесе/сервисе. Мой клиентский слой (html/javascript) должен знать только, что «ограничение первичного ключа» было нарушено. Зачем отправлять всю структуру исключений, если она не нужна? – outlookrperson