Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.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 JpaRepository deleteById方法不';在引发异常的if语句中,不能工作_Java_Spring Boot_Exception_Spring Data Jpa - Fatal编程技术网

Java JpaRepository deleteById方法不';在引发异常的if语句中,不能工作

Java JpaRepository deleteById方法不';在引发异常的if语句中,不能工作,java,spring-boot,exception,spring-data-jpa,Java,Spring Boot,Exception,Spring Data Jpa,我有一个奇怪的问题。我想实现一个功能,用户注册并获得一个验证令牌,该令牌在一段时间内保持有效,用户可以激活他的帐户。如果令牌在用户激活其帐户之前过期,则将从数据库中删除该用户并引发异常。但是,当我将JpaRepository的deleteById方法放在异常之前的if语句中时,它不起作用。所以我不能删除用户。这是我的密码: private void fetchUserAndEnable(String verificationToken){ User user = userRep

我有一个奇怪的问题。我想实现一个功能,用户注册并获得一个验证令牌,该令牌在一段时间内保持有效,用户可以激活他的帐户。如果令牌在用户激活其帐户之前过期,则将从数据库中删除该用户并引发异常。但是,当我将JpaRepository的deleteById方法放在异常之前的if语句中时,它不起作用。所以我不能删除用户。这是我的密码:

 private void fetchUserAndEnable(String verificationToken){
        User user = userRepository.findByVerificationToken(verificationToken).orElseThrow(() -> new ItemNotFoundException("User has not been found"));

        //check if signup token has expired or not
            if(Instant.now().toEpochMilli() - user.getCreated().toEpochMilli() > 1500_0){
                System.out.println(user.getUserId());
                userRepository.deleteById(user.getUserId());
                throw new PortfolioException("The verification token has expired!");
            } 

        user.setEnabled(true);
        userRepository.save(user);
    }
但是,在执行异常之前的这一行:

 System.out.println(user.getUserId());
而这一行——不是:

 userRepository.deleteById(user.getUserId());
但是,当我没有在“if”语句中抛出异常时,deleteById方法可以工作:

 private void fetchUserAndEnable(String verificationToken){
            User user = userRepository.findByVerificationToken(verificationToken).orElseThrow(() -> new ItemNotFoundException("User has not been found"));
    
            //check if signup token has expired or not
                if(Instant.now().toEpochMilli() - user.getCreated().toEpochMilli() < 1500_0){
                    System.out.println(user.getUserId());
                    userRepository.deleteById(user.getUserId());
                } else {
                    user.setEnabled(true);
                    userRepository.save(user);
             }
        }
private void fetchUserAndEnable(字符串验证登录){
User User=userRepository.findByVerificationToken(verificationToken).OrelsThrow(()->new ItemNotFoundException(“未找到用户”);
//检查注册令牌是否已过期
if(Instant.now().toEpochMilli()-user.getCreated().toEpochMilli()<15000){
System.out.println(user.getUserId());
userRepository.deleteById(user.getUserId());
}否则{
user.setEnabled(true);
userRepository.save(用户);
}
}

为什么会这样?我犯了什么错?谢谢大家!

我假设您在事务中运行此代码,该事务由于您抛出的
PortfolioException
而回滚


如果您使用
@Transactional
注释,为了避免这种情况,只需声明您不希望事务通过
@Transactional(norollboor=PortfolioException.class)
回滚到
PortfolioException
。这样,不管异常如何,事务都将被提交,用户将被删除。

我假设您在事务中运行此代码,该事务由于抛出的
PortfolioException
而回滚


如果您使用
@Transactional
注释,为了避免这种情况,只需声明您不希望事务通过
@Transactional(norollboor=PortfolioException.class)
回滚到
PortfolioException
。这样,不管异常情况如何,事务都将被提交,用户将被删除。

您如何确定它不会被执行?你有什么错误吗?或者你只是检查数据库的变化?首先,你的逻辑无法说服我。为什么出现异常?人们期望从
fetchUserAndEnable()
方法中获取用户并在找到时启用。并向我们显示您在哪里使用
@Transactional
。但是,第二条路是正确的imo@TheCoolDrop,是的,我检查数据库看它是否有效,在我发布问题之前,我试过@Transactional注释,但它不起作用。我需要抛出一个异常才能将其发送到angular应用程序,否则应用程序将无法理解smth出错。Piotr Podraza提供的解决方案:“@Transactional(norollboor=PortfolioException.class)”帮助了我,现在它可以正常工作了。您如何确定它不会被执行?你有什么错误吗?或者你只是检查数据库的变化?首先,你的逻辑无法说服我。为什么出现异常?人们期望从
fetchUserAndEnable()
方法中获取用户并在找到时启用。并向我们显示您在哪里使用
@Transactional
。但是,第二条路是正确的imo@TheCoolDrop,是的,我检查数据库看它是否有效,在我发布问题之前,我试过@Transactional注释,但它不起作用。我需要抛出一个异常才能将其发送到angular应用程序,否则应用程序将无法理解smth出错。Piotr Podraza提供的解决方案:“@Transactional(norollboor=PortfolioException.class)”帮助了我,现在它可以正常工作了不,我没有使用@Transactional注释。我早就试过了,但没用,我把它摔了。然而,我添加了您的代码:@Transactional(norollboor=PortfolioException.class),它开始工作了。非常感谢。但您能解释一下为什么会发生这种情况吗?默认情况下,事务范围内抛出的任何
RuntimeException
都会导致它回滚—这意味着您在异常之前所做的更改不会影响您的数据库状态。使用
@Transactional(norollboor=PortfolioException.class)
您指示Spring为
PortfolioException
创建一个异常,这样它就不会像其他
RuntimeException
s那样引发回滚。感谢Piotr的帮助!现在我知道如果这种情况再次发生该怎么办了不,我没有使用@Transactional annotation。我早就试过了,但没用,我把它摔了。然而,我添加了您的代码:@Transactional(norollboor=PortfolioException.class),它开始工作了。非常感谢。但您能解释一下为什么会发生这种情况吗?默认情况下,事务范围内抛出的任何
RuntimeException
都会导致它回滚—这意味着您在异常之前所做的更改不会影响您的数据库状态。使用
@Transactional(norollboor=PortfolioException.class)
您指示Spring为
PortfolioException
创建一个异常,这样它就不会像其他
RuntimeException
s那样引发回滚。感谢Piotr的帮助!现在我知道如果这种情况再次发生该怎么办了