Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在JPA中处理ConstraintviolationException_Java_Jpa_Spring Boot - Fatal编程技术网

Java 在JPA中处理ConstraintviolationException

Java 在JPA中处理ConstraintviolationException,java,jpa,spring-boot,Java,Jpa,Spring Boot,我的问题很常见,但我似乎找不到任何解决办法。我找了很多,但什么也没找到 情况: 试图插入导致外键冲突的行,该外键冲突导致我的事务回滚。 不管我处理什么异常,它总是从我的rest端点抛出500个异常,这是完全不可接受的 问题: 如何优雅地处理这个问题。下面是我不工作的代码 @Transactional(dontRollbackOn={InvalidModelException.class,PersistenceException.class,ConstraintViolationException

我的问题很常见,但我似乎找不到任何解决办法。我找了很多,但什么也没找到

情况:

试图插入导致外键冲突的行,该外键冲突导致我的事务回滚。 不管我处理什么异常,它总是从我的rest端点抛出500个异常,这是完全不可接受的

问题: 如何优雅地处理这个问题。下面是我不工作的代码

@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如何导致正确的提交?我试图捕获异常,以便了解它是否是已知情况,而不是其他情况。另一部分,我试图跳过一些异常,坦率地说,这些异常是为了看看这是否能让我自己处理异常。