后端提示:
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;
}