报错详情:
2021-11-30 19:36:04.328 ERROR 12396 --- [ main] o.s.b.web.embedded.tomcat.TomcatStarter : Error starting Tomcat context. Exception: org.springframework.beans.factory.UnsatisfiedDependencyException. Message: Error creating bean with name 'securityConfig': Unsatisfied dependency expressed through field 'adminService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'adminServiceImpl': Unsatisfied dependency expressed through field 'userDetailsService'; nested exception is org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'securityConfig': Requested bean is currently in creation: Is there an unresolvable circular reference?
代码结构图:
AdminServiceImpl文件:
@Service
public class AdminServiceImpl extends ServiceImpl<AdminMapper, Admin> implements IAdminService {
@Autowired
private AdminMapper adminMapper;
@Autowired
private UserDetailsService userDetailsService;
@Autowired
private PasswordEncoder passwordEncoder;
@Autowired
private JwtTokenUtil jwtTokenUtil;
@Value("${jwt.tokenHead}")
private String tokenHead;
// 登录返回token
@Override
public RespBean login(String username, String password, HttpServletRequest request) {
//登录
UserDetails userDetails =
userDetailsService.loadUserByUsername(username);
if (null == userDetails || !passwordEncoder.matches(password,
userDetails.getPassword())) {
return RespBean.error("用户名或密码不正确!");
}
if (!userDetails.isEnabled()) {
return RespBean.error("账号被禁用,请联系管理员!");
}
// 更新登录用户对象
UsernamePasswordAuthenticationToken authentication =
new UsernamePasswordAuthenticationToken(userDetails, null,
userDetails.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(authentication);
// 生成token
String token = jwtTokenUtil.generateToken(userDetails);
Map<String, String> tokenMap = new HashMap<>();
tokenMap.put("token", token);
tokenMap.put("tokenHead", tokenHead);
return RespBean.success("登录成功", tokenMap);
}
// 根据用户名获取用户
@Override
public Admin getAdminByUserName(String username) {
return adminMapper.selectOne(new QueryWrapper<Admin>().eq("username",
username).eq("enabled",true));
}
}
IAdminService文件:
@Service
public interface IAdminService extends IService<Admin> {
// 登录返回token
RespBean login(String username, String password, HttpServletRequest request);
// 根据用户名获取用户
Admin getAdminByUserName(String username);
}
mapper.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.server.mapper.AdminMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.server.pojo.Admin">
<id column="id" property="id" />
<result column="name" property="name" />
<result column="phone" property="phone" />
<result column="telephone" property="telephone" />
<result column="address" property="address" />
<result column="enabled" property="enabled" />
<result column="username" property="username" />
<result column="password" property="password" />
<result column="userFace" property="userFace" />
<result column="remark" property="remark" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id, name, phone, telephone, address, enabled, username, password, userFace, remark
</sql>
</mapper>