事物注解不生效@Transactional问题
@Transactional(rollbackFor = Exception.class)
原因
shiro框架导致的@Transactional 注解不生效
解决办法
在继承了AuthorizingRealm的类中使用@Lazy注解 用于延迟加载
核心代码
@Lazy
@Resource
private UserService userService;
@Lazy
@Resource
private UserDao userDao;
全部代码
package com.blog.config.shiro;
import com.blog.base.BaseException;
import com.blog.entity.Permission;
import com.blog.entity.Role;
import com.blog.dao.UserDao;
import com.blog.service.UserService;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import javax.annotation.Resource;
import com.blog.entity.User;
import org.springframework.context.annotation.Lazy;
import java.util.List;
/**
* @author imsjw
* @Date Created in 22:45 2018/6/17
*/
public class ShiroRealm extends AuthorizingRealm {
@Lazy
@Resource
private UserService userService;
@Lazy
@Resource
private UserDao userDao;
/**
* 授权
*
* @param principals
* @return
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
User user = (User) principals.getPrimaryPrincipal();
List<Role> roles = user.getRoles();
for (int i = 0; i < roles.size(); i++) {
Role role = roles.get(i);
simpleAuthorizationInfo.addRole(role.getId());
List<Permission> permissions = role.getPermissions();
for (int j = 0; j < permissions.size(); j++) {
simpleAuthorizationInfo.addStringPermission(permissions.get(j).getId());
}
}
List<Permission> privilege = user.getPrivilege();
if (privilege != null) {
for (int i = 0; i < privilege.size(); i++) {
Permission permission = privilege.get(i);
simpleAuthorizationInfo.addStringPermission(permission.getId());
}
}
return simpleAuthorizationInfo;
}
/**
* 登陆认证
*
* @param authenticationToken
* @return
* @throws AuthenticationException
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
String name = token.getUsername();
User user = userDao.findByEmail(name);
if (user == null) {
throw new UnknownAccountException("用户不存在");
}
String credentials = user.getPassword();
SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(user, credentials, this.getName());
return simpleAuthenticationInfo;
}
/**
* 自定义密码校验
*
* @param authenticationToken
* @param authenticationInfo
* @throws AuthenticationException
*/
@Override
protected void assertCredentialsMatch(AuthenticationToken authenticationToken, AuthenticationInfo authenticationInfo) throws AuthenticationException {
UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
SimpleAuthenticationInfo info = (SimpleAuthenticationInfo) authenticationInfo;
String password = new String(token.getPassword());
User user = (User) info.getPrincipals().getPrimaryPrincipal();
String dataBasePassword = (String) info.getCredentials();
password = userService.loginPasswordEncoder(password, user.getSalt());
if (!password.equals(dataBasePassword)) {
throw new IncorrectCredentialsException();
}
}
}