Поймать исключения Hibernate в Quarkus - PullRequest
0 голосов
/ 27 февраля 2020

Я пытаюсь создать небольшой REST-сервис с использованием Quarkus. Я использую Hibernate и базу данных PostgreSQL. Это работает довольно хорошо во всех хороших случаях. Но когда есть исключения Hibernate, такие как ConstraintViolationException, я не могу их отловить обычным способом. Исключения обернуты другими исключениями ArcUndeclaredThrowableException и RollbackException. Таким образом, исключения могут быть просто перехвачены с помощью

catch (ArcUndeclaredThrowableException e) {
...
}

Репозиторий

@Dependent
public class UserRepository {

    @Transactional
    public void createUser(User user) {
        getEntityManager().persist(user); //<- the constraint violation happens at commit, so when transaction will be closed
    }
}

Ресурс

    @Override
    public Response createUser(@Valid CreateUserDTO createUserDTO, UriInfo uriInfo) {
        ...
        try {
            userRepository.createUser(user);
        } catch (ArcUndeclaredThrowableException e) { //<- here the hibernate exception should be catchable
            log.error(e.getMessage());
            throw e;
        }
        return Response.ok().build();
    }

Из-за этой проблемы также невозможно добавить ExceptionMapper для HibernateExceptions. У кого-нибудь были подобные проблемы или есть общая проблема с моим кодом? Я использую Java11.

Ответы [ 3 ]

1 голос
/ 27 февраля 2020

Я бы сделал это следующим образом:

    try {
        getEntityManager().persist(user);
        getEntityManager().flush();
} catch(ConstraintViolationException e) {
    throw new MyCustomException(e);
}

И создал бы Exception mapper для MyCustomException.

0 голосов
/ 23 апреля 2020

У меня была такая же проблема сегодня, и я нашел обходной путь. Проблема, насколько я могу понять, в том, что Ar c (реализация cark в cdi) иногда нужно генерировать классы.

Проверенные исключения (такие как javax.transaction.RollbackExcpetion) должны как-то продвигаться пользователю. Поэтому проверенное исключение оборачивается внутри ArcUndeclaredThrowableException. Это необходимо сделать только в том случае, если вы явно не обрабатываете исключение.

Например, вы можете просто объявить исключение:

@Dependent
public class UserRepository {

    @Transactional
    public void createUser(User user) throws RollbackException{
        getEntityManager().persist(user);
    }
}

В вашем ресурсе вы можете перехватить RollbackException

@Override
public Response createUser(@Valid CreateUserDTO createUserDTO, UriInfo uriInfo) {
    ...
    try {
        userRepository.createUser(user);
    } catch (RollbackException e) {
        log.error(e.getMessage());
        throw e;
    }
    return Response.ok().build();
}
0 голосов
/ 27 февраля 2020

Вы можете выполнить sh сеанс Hibernate, который должен вызывать исключения, такие как ConstraintViolationException без фиксации транзакции.

В вашем случае это должно быть что-то вроде

@Dependent
public class UserRepository {

    @Transactional
    public void createUser(User user) {
        getEntityManager().persist(user);
        getEntityManager().flush();// should triger ConstraintViolationException
    }
}
...