关于SpringSecurity启动服务器报no bean named xxx available

在使用springSecurity进行加密认证的过程中遇到了如下的一个错误

在这里插入图片描述

如图中红框框起来的部分,报了一个No bean named ‘UserService’ available的异常,说是springIOC容器没有找到名字为userService的实例对象。
一般遇到这个问题的第一反应是没有将userService这个类交给IOC容器管理,于是小编打开了userService所在的userServiceImpl类,代码如下:

@Service("UserService")
@Transactional
public class UserServiceImpl implements UserService {
    @Autowired
    private UserDao userDao;

    @Autowired
    private RoleService roleService;

    @Autowired
    private BCryptPasswordEncoder passwordEncoder;

    @Override
    public void save(SysUser user) {
        String encode = passwordEncoder.encode(user.getPassword());
        user.setPassword(encode);
        userDao.save(user);
    }

    @Override
    public List<SysUser> findAll() {
        return userDao.findAll();
    }

    @Override
    public Map<String, Object> toAddRolePage(Integer id) {
        List<SysRole> allRoles = roleService.findAll();
        List<Integer> myRoles = userDao.findRolesByUid(id);
        Map<String, Object> map = new HashMap<>();
        map.put("allRoles", allRoles);
        map.put("myRoles", myRoles);
        return map;
    }

    @Override
    public void addRoleToUser(Integer userId, Integer[] ids) {
        userDao.removeRoles(userId);
        for (Integer rid : ids) {
            userDao.addRoles(userId, rid);
        }
    }

    /**
     * 数据库认证
     * @param username 用户在浏览器输入的用户名
     * @author  Admin
     * @date   2021/1/8 22:19
     * @return org.springframework.security.core.userdetails.UserDetails springsecurity自己的对象
     */
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        try {
            //根据用户名做查询
            SysUser sysUser = userDao.findByName(username);
            if (sysUser == null) {
                return null;
            }
            List<SysRole> roles = sysUser.getRoles();
            List<SimpleGrantedAuthority> authorities = new ArrayList<>();
//            authorities.add(new SimpleGrantedAuthority("ROLE_USER"));
            //动态添加角色
            for (SysRole role : roles) {
                authorities.add(new SimpleGrantedAuthority(role.getRoleName()));
            }
            //{noop}后面的密码,springsecurity会认为是原文
            UserDetails userDetails = new User(sysUser.getUsername(), sysUser.getPassword(),
                    authorities);
            return userDetails;
        } catch (Exception e) {
            e.printStackTrace();
            //springsecurity返回null默认失败
            return null;
        }
    }
}

小编发现在UserServiceImpl类中,添加了@Service注解,也就是说UserServiceImpl类已经被交给IOC容器管理了,那是什么原因呢?
后来小编仔细看了下项目结构,发现了一个问题:
在这里插入图片描述
在小编的项目结构红框框起来的UserServiceImpl类的左上角有一个灰色的叉叉,小编想会不会是因为这个的原因导致项目启动的时候找不到UserServiceImpl类的Bean呢?
于是小编打开File --> Settings --> Build --> Compiler --> Exculdes发现Compiler右侧多了一行记录
在这里插入图片描述
至此,问题解决

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐