当前位置: 首页 > 知识库问答 >
问题:

捕获Quarkus中的Hibernate异常

夹谷山
2023-03-14

我正在尝试使用Quarkus构建一个小型REST服务。我正在使用Hibernate和PostgreSQL数据库。它在所有好的情况下都非常有效。但是当出现Hibernate异常时,比如ConstraintViolationException,我无法以正常方式捕获它们。异常被包装为其他异常ArcUndeclaredThrowableExceptionRollbackException。因此,可以通过使用

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();
    }

由于这个问题,也无法为HibernateException添加一个ExceptionMapper。是否有人遇到过类似的问题,或者我的代码存在一般性问题?我正在使用Java11。

共有3个答案

戚升
2023-03-14

我今天也遇到了同样的问题,找到了解决办法。据我所知,问题是Arc(quarkus的cdi实现)有时需要生成类。

检查过的异常(如javax.transaction.rollbackexpetion)需要以某种方式分配给用户。因此,选中的异常被包装在ArcUndeclaredThroTableException中。但是,只有在没有显式处理异常的情况下才需要这样做。

例如,您可以只声明异常:

@Dependent
public class UserRepository {

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

在资源中,然后可以捕获Rollback异常

@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();
}
邹学民
2023-03-14

您可以刷新Hibernate会话,这将触发异常,如ConstraintViolationException,而无需提交事务。

在你的情况下,这应该是这样的

@Dependent
public class UserRepository {

    @Transactional
    public void createUser(User user) {
        getEntityManager().persist(user);
        getEntityManager().flush();// should triger ConstraintViolationException
    }
}
窦志新
2023-03-14

我会这样做:

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

并创建异常映射器MyCustomExc农田。

 类似资料:
  • 当该列与数据库列不匹配时,我们将在日志中获得以下行的异常。但它并没有破例。我甚至保留了尝试接球。我怎样才能抓住例外? WARN 2015-11-04 17:25:44055[http-apr-8080-exec-4][SqlExceptionHelper.java:144]:SQL错误:904,SQLState:42000错误2015-11-04 17:25:44055[http-apr-8080

  • 我有两个可用的gRPCendpoint和一个ServerInterceptor,它应该在抛出异常时拦截异常。 gRPC服务定义如下: gRPC服务使用SmallRye Mutiny Responsive来处理请求。 其他帖子解释说,应该重写onHalfClose方法,并插入try/catch块来捕获自定义异常,然后映射到StatusRuntimeException gRPC可以使用的状态。我尝试了

  • 我正在使用以下PostgreSQL函数从数据库中的表中删除记录。 上表的主键列(即段表的id列)被另一个表引用为外键,当我执行上述函数从另一个表引用的段表中删除记录时,该函数会按预期引发错误(如下所示)。 现在我从我的Java代码调用这个PostgreSQL函数,它使用Hibernate如下所示, 当我将相同的id传递给上述函数(Integer)(query.list()时。get(0))执行时不

  • export class SearchService { ... .map((response) => response.json()) .catch((e) => { if (e.status >== 500) { return cachedVersion(); new Error(`${ e.status

  • 我的用它的作用域启动coroutine 我的只处理一些逻辑,在本例中是某种验证器 然后我的只处理网络层/本地层 以下是我得到的错误日志: 错误直接指向显式的语句。

  • 问题内容: 如果我没记错的话,应该首先捕获Exception的子类。但是必须捕获任何RuntimeException和一个具体的经过检查的Exception,首先应该捕获它们吗? 这个命令正确吗?还是正确但错误的选择? 问题答案: 顺序是 先匹配的,然后执行 (正如JLS清楚地解释的)。 如果第一个catch匹配到异常,则执行,否则,将尝试下一个,并不断重复直到匹配或不匹配。 因此,在捕获异常时,