SpringSecurity 自动注入dao出现 NPE如何解决?

发布于 2022-09-12 13:20:16 字数 2667 浏览 16 评论 0

### 问题描述
如题:SpringSecurity 自动注入dao出现 NPE,经过大量查找资料后意识到问题的原因为SpringSecurity是基于filter,而filter的初始化在自动bean初始化之前,所以自动注入出现NPE,暂未找到解决的方案因此求助各位大佬

### 相关代码
实现自定义用户认证的代码:

@Service
public class UserDetailServiceImp implements UserDetailsService {
    @Autowired
    UserDao userDao;//此处为问题根本,注入的dao为null
    
    @Override
     public UserDetails loadUserByUsername(String un) throws UsernameNotFoundException {
            //当将此处换位 User user = new user();NPE解决
            //由此可知,问题根本为没有注入的UserDao,但是
            //《Spring 实战第五版》的代码案例注入没有问题
            //是否为Mybaits的问题?(书中使用JPA)
            User user = userDao.getByUsername(un);
            if(user != null){
                return user;
            }
            throw new UsernameNotFoundException("用户:"+user.getUn()+"不存在");
        }
}

UserDao代码(是个mybatis的接口):

public interface UserDao {
    @Insert("INSERT INTO users(id, un, pd, avatar, nickname, email, createAt) VALUES" +
            "(#{user.id}, #{user.un}, #{user.pd}, #{user.avatar}, #{user.nickname}, #{user.email}, #{user.createAt})")
    void register(@Param("user") User user);
    @Select("SELECT * FROM users WHERE un = #{un} or email = #{email}")
    User getByUn(@Param("un") String un, @Param("email") String email);
    @Select("SELECT * FROM users WHERE un = #{un}")
    User getByUsername(@Param("un") String un);
    @Select("SELECT id, pd FROM users WHERE un = #{un} OR email = #{un}")
    LinkedHashMap<String, String> getPd(@Param("un") String un);
    @Select("SELECT * FROM users WHERE id = #{id}")
    User getById(@Param("id")String id);
}

错误提示(与参考中的【https://blog.csdn.net/u013062...】错误提示相同,但那个博主只分析了原因,没有给出解决方案...)

Caused by: java.lang.NullPointerException: null
    at com.zcj.chat.service.UserDetailServiceImp.loadUserByUsername(UserDetailServiceImp.java:24) ~[classes/:na]
    at org.springframework.security.authentication.dao.DaoAuthenticationProvider.retrieveUser(DaoAuthenticationProvider.java:108) ~[spring-security-core-5.3.4.RELEASE.jar:5.3.4.RELEASE]
    ... 50 common frames omitted

### 你期待的结果是什么?实际看到的错误信息又是什么?

  • 如何在SpringSecurity的filter中注入对象?

问题参考资料:
https://www.cnblogs.com/shamo...
https://blog.csdn.net/ycf9212...
https://blog.csdn.net/u013062...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

甜警司 2022-09-19 13:20:16

这属于spring的范畴,和spring security 没关系
你需要一个UserDao的bean

狠疯拽 2022-09-19 13:20:16

我也是用的mybatis,为啥我就没问题?

咋地 2022-09-19 13:20:16

包扫描需要扫描到你这个UserDao所在的包。

另外UserDao上加上这两个注解:

@Repository
@Mapper

@Repository表示把这个接口交给Spring初始化和控制。
@Mapper表示这是一个mybatisMapper接口类,需要mybatis动态生成实现类(SQL操作的实现)。

这些都是Spring的基本知识,建议多去看看Spring的基础。

︶ ̄淡然 2022-09-19 13:20:16

我和你的用法差不多,我没有遇到这个问题呢,猜测还是spring 与mybatis的整合配置不对;
image.png
配置mapper的位置
image.png

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文