我正在使用 Hibernate Reactive 和 PostgreSQL 开发一个 Quarkus 项目。我有一个将新用户保留在数据库中的方法,并且我想处理由于电子邮件字段的唯一约束而导致重复用户(相同电子邮件)导致 ConstraintViolationException 的情况。
我使用 .onFailure() 设置了一个错误处理块来捕获此异常并抛出自定义 UserAlreadyExistsException。但是,该异常并未在故障块中被捕获,相反,我在日志中看到了未捕获的 ConstraintViolationException。
@POST
@Path("/register")
@WithTransaction
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Uni<Response> registerUser(@Valid Auth authRequest) {
return authService.createUser(authRequest)
.onItem().transform(success -> Response.status(Response.Status.CREATED)
.entity(success).build())
.onFailure()
.recoverWithItem(ex -> {
log.error("Unable to create User, email: {}, Exception: {}", authRequest.getEmail(), ex.getMessage(), ex);
ErrorResponse errorResponse = new ErrorResponse(ex.getMessage(), Response.Status.INTERNAL_SERVER_ERROR);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(errorResponse).build();
});
}
public Uni<Auth> createUser(Auth authRequest) {
User user = new User(authRequest);
String passwordHash = Password.hash(authRequest.getPassword()).withArgon2().getResult();
user.setPasswordHash(passwordHash);
return PanacheEntityBase.persist(user).onItem().transform(success -> {
log.info("Successfully created user, email: {}", authRequest.getEmail());
return authRequest;
})
.onFailure().invoke(ex -> {
log.error("Unable to create User, email: {}, Exception: {}",
authRequest.getEmail(), ex.getMessage(), ex);
throw new RegistrationFailedException(Errors.UNABLE_TO_REGISTER_USER + ex.getMessage());
});
}
我的期望:
当尝试插入具有现有电子邮件(重复键)的用户时,onFailure()块应捕获 ConstraintViolationException,并抛出自定义 UserAlreadyExistsException。
会发生什么:
错误没有被 onFailure() 块捕获,而是返回了以下错误:
org.hibernate.exception.ConstraintViolationException: error executing SQL statement
[ERROR: duplicate key value violates unique constraint "user_email_key" (23505)]
看起来失败处理程序没有捕获异常,并且我得到了未捕获的异常响应。