springboot中事务无法启动

后端提示:

SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@345e8a01] was not 
registered for synchronization because synchronization is not active
JDBC Connection [HikariProxyConnection@1692939796 wrapping
com.mysql.cj.jdbc.ConnectionImpl@2099e4b4] will not be managed by Spring

提示翻译:SqlSession 线程锁未激活,JDBC Connection为加入到Spring容器中

错误原因:

错误一:在自定义realm中使用了IUserService 接口,IUserService 的加载要先于AOP织就初始化了。具体详情可以看这篇文章:SpringBoot+Shiro引起事务失效、错误原因、解决方法_finalcola的博客-CSDN博客_shiro 事务失效

@Slf4j
public class MyRealm extends AuthorizingRealm {
    
    @Autowired
    IUserService userService;


    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {


        return null;
    }

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {

        // 拿到前端发送的用户名,authenticationToken是一个Token因此可以拿到用户名
        String username = (String)authenticationToken.getPrincipal();
        System.out.println("username = " + username);

        // 新建查询语句
        QueryWrapper<User> qw = new QueryWrapper();
        qw.eq("username",username);


        // 进行查询
        User user = userService.selectOne(qw);
        // 拿到盐并进行转换
        String salt = user.getSalt();
        ByteSource bytes = ByteSource.Util.bytes(salt);

        // 把数据库中的数据打包到SimpleAuthenticationInfo当中去
        AuthenticationInfo info = new SimpleAuthenticationInfo(
                user,
                user.getPassword(),
                bytes,
                getName()

        );
        return info;
    }

}

解决方法:

方法一:在IUserService 接口上加上@Lazy注解,加上@Lazy注解后IUserService的注入会开启懒注入模式,在调用的时候再进行加载。

 
@Lazy
@Autowired
IUserService userService;

方法二:将IUserService 接口替换为UserMapper接口这样也不会出现事务失效的问题。

@Autowired
UserMapper userMapper;

错误二:把异常放到try代码块中捕获了手动抛出的异常。使用try捕获异常后,Spring的事务管理将不会捕获到你手抛的异常,因为你使用了try捕获捕获异常,Spring会默认你已经处理了异常,不需要它进行异常的处理了。因此不能使用try.捕获异常。

并且如果你使用了try捕获异常Spring的异常管理器也不会对异常进行处理,因为系统会默认你处理了异常,所以不会帮你处理异常。

错误代码:

@Transactional
    @Override
    public boolean saveUser(User user) {

        // 先对密码进行加密操作
        String salt = PasswordUtils.createSalt();
        String md5password = PasswordUtils.createPassword(user.getPassword(), salt, 6);
        user.setPassword(md5password);
        user.setSalt(salt);
        int insertUser = 0;
        int insertUserRole = 0;


        try {
            // 进行用户插入操作
            insertUser = userMapper.insert(user);


            // 向t_User_Role表中插入数据
            UserRole userRole = new UserRole();
            userRole.setUid(user.getUid());
            userRole.setRid(user.getRid());
            insertUserRole = userRoleMapper.insert(userRole);
            throw new RuntimeException();

        } catch (RuntimeException e) {
            e.printStackTrace();
        }


        // 进行判断返回结果
        if(insertUser>0&&insertUserRole>0){

            return true;

        }


        return false;
    }

解决方法:将异常写在catch代码块中

@Transactional
    @Override
    public boolean saveUser(User user) {

        // 先对密码进行加密操作
        String salt = PasswordUtils.createSalt();
        String md5password = PasswordUtils.createPassword(user.getPassword(), salt, 6);
        user.setPassword(md5password);
        user.setSalt(salt);
        int insertUser = 0;
        int insertUserRole = 0;


        try {
            // 进行用户插入操作
            insertUser = userMapper.insert(user);


            // 向t_User_Role表中插入数据
            UserRole userRole = new UserRole();
            userRole.setUid(user.getUid());
            userRole.setRid(user.getRid());
            insertUserRole = userRoleMapper.insert(userRole);
            

        } catch (RuntimeException e) {
            throw new RuntimeException();
            e.printStackTrace();
        }


        // 进行判断返回结果
        if(insertUser>0&&insertUserRole>0){

            return true;

        }


        return false;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring Boot 提供了对事务管理的内置支持,使得在应用程序轻松地启用和配置事务变得简单。Spring Boot 通常会集成 Spring Data JPA 或者 Hibernate,这两个框架都内置了对事务的支持。 要启动一个事务,你可以遵循以下步骤: 1. 配置数据源:确保在 `application.properties` 或 `application.yml` 配置了数据库连接信息,如 `spring.datasource.url`, `spring.datasource.username`, 和 `spring.datasource.password`。 2. 指定事务管理器:Spring Boot 默认使用 `PlatformTransactionManager`,这基于 `JpaTransactionManager` 或 `HibernateTransactionManager`(取决于你选择的数据访问策略)。 3. 注解驱动:对于基于注解的方式,你可以在 Repository 接口使用 `@Repository` 注解来自动装配事务Spring 会自动将这些接口的方法映射到事务边界。 ```java @Repository public interface UserRepository extends JpaRepository<User, Long> { // 这些方法会自动在数据库操作前后被事务包裹 User findById(Long id); void save(User user); } ``` 4. 使用@Transactional:如果你想要在非Repository类的方法上手动开启事务,可以使用 `@Transactional` 注解。 ```java @Service @Transactional public class UserService { public void createUser(User user) { // 方法体内的所有数据操作都会在事务内执行 // 如果在此过程出现异常,整个事务会被回滚 // 并且不会影响到其他已提交的事务 } } ``` 5. 自定义事务管理:如果需要更高级别的控制,比如不同服务使用不同的事务管理策略,可以通过 `@EnableTransactionManagement` 注解和 `@Rollback`、`@Commit` 等属性来定制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小海海不怕困难

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值