Java 在JPA中处理ConstraintviolationException
我的问题很常见,但我似乎找不到任何解决办法。我找了很多,但什么也没找到 情况: 试图插入导致外键冲突的行,该外键冲突导致我的事务回滚。 不管我处理什么异常,它总是从我的rest端点抛出500个异常,这是完全不可接受的 问题: 如何优雅地处理这个问题。下面是我不工作的代码Java 在JPA中处理ConstraintviolationException,java,jpa,spring-boot,Java,Jpa,Spring Boot,我的问题很常见,但我似乎找不到任何解决办法。我找了很多,但什么也没找到 情况: 试图插入导致外键冲突的行,该外键冲突导致我的事务回滚。 不管我处理什么异常,它总是从我的rest端点抛出500个异常,这是完全不可接受的 问题: 如何优雅地处理这个问题。下面是我不工作的代码 @Transactional(dontRollbackOn={InvalidModelException.class,PersistenceException.class,ConstraintViolationException
@Transactional(dontRollbackOn={InvalidModelException.class,PersistenceException.class,ConstraintViolationException.class,MySQLIntegrityConstraintViolationException.class})
@Override
public PointAudit createPointAudit(PointAudit pointAudit) throws EmptyModelException, InvalidModelException {
if(pointAudit != null) {
try {
this.entityManager.persist(pointAudit);
this.entityManager.flush();
}
catch(RollbackException x) {
LOGGER.error(x.getMessage(), x);
}
catch(PersistenceException x) {
if(x.getCause() instanceof ConstraintViolationException) {
if(x.getCause().getCause() instanceof MySQLIntegrityConstraintViolationException)
{
MySQLIntegrityConstraintViolationException e = (MySQLIntegrityConstraintViolationException)x.getCause().getCause();
if(e.getMessage().contains("USER_ID")) {
throw new InvalidModelException("Invalid user is provided");
}
else {
if(e.getMessage().contains("STATUS")) {
throw new InvalidModelException("Invalid status is provided");
}
else {
if(e.getMessage().contains("CHANNEL")) {
throw new InvalidModelException("Invalid channel is provided");
}
else {
if(e.getMessage().contains("ACTION")) {
throw new InvalidModelException("Invalid action is provided");
}
}
}
}
}
}
else {
while( !(x.getCause() instanceof RollbackException) || x.getCause() == null) {
LOGGER.error(x.getMessage(), x);
}
}
}
}
else {
throw new EmptyModelException("Point Audit is empty");
}
return pointAudit;
}
如果需要任何进一步的代码,请让我知道您所说的“句柄”是什么意思?使用stacktrace向客户端返回http-500以外的内容?通常我可以获取错误的原因,我希望用正确的错误消息响应http-500您正在捕获并接受异常。Spring没有看到它,在方法完成后尝试提交,但无法提交,因此出现错误。永远不要捕获和吞咽异常,否则会破坏正确的发送管理。接下来,您告诉它忽略回滚的某些异常,因此将进行提交,但ConstraintVoil如何导致正确的提交?我试图捕获异常,以便了解它是否是已知情况,而不是其他情况。另一部分,我试图跳过一些异常,坦率地说,这些异常是为了看看这是否能让我自己处理异常。你说的“处理”是什么意思?使用stacktrace向客户端返回http-500以外的内容?通常我可以获取错误的原因,我希望用正确的错误消息响应http-500您正在捕获并接受异常。Spring没有看到它,在方法完成后尝试提交,但无法提交,因此出现错误。永远不要捕获和吞咽异常,否则会破坏正确的发送管理。接下来,您告诉它忽略回滚的某些异常,因此将进行提交,但ConstraintVoil如何导致正确的提交?我试图捕获异常,以便了解它是否是已知情况,而不是其他情况。另一部分,我试图跳过一些异常,坦率地说,这些异常是为了看看这是否能让我自己处理异常。