Java JpaRepository deleteById方法不';在引发异常的if语句中,不能工作
我有一个奇怪的问题。我想实现一个功能,用户注册并获得一个验证令牌,该令牌在一段时间内保持有效,用户可以激活他的帐户。如果令牌在用户激活其帐户之前过期,则将从数据库中删除该用户并引发异常。但是,当我将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
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的帮助!现在我知道如果这种情况再次发生该怎么办了