我正在尝试使用Quarkus构建一个小型REST服务。我正在使用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();
}
由于这个问题,也无法为HibernateException添加一个ExceptionMapper
。是否有人遇到过类似的问题,或者我的代码存在一般性问题?我正在使用Java11。
我今天也遇到了同样的问题,找到了解决办法。据我所知,问题是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();
}
您可以刷新Hibernate会话,这将触发异常,如ConstraintViolationException
,而无需提交事务。
在你的情况下,这应该是这样的
@Dependent
public class UserRepository {
@Transactional
public void createUser(User user) {
getEntityManager().persist(user);
getEntityManager().flush();// should triger ConstraintViolationException
}
}
我会这样做:
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匹配到异常,则执行,否则,将尝试下一个,并不断重复直到匹配或不匹配。 因此,在捕获异常时,