写了一个获取spring 对象的工具类,为什么其它模块引入使用报错????

发布于 2022-09-13 00:08:34 字数 1064 浏览 16 评论 0

我写了一个工具类继承ApplicationContextAware接口方便个别无法使用@Autowired注入的类注入spring容器中

public class SpringUtil implements ApplicationContextAware {
 private static ApplicationContext applicationContext;
  .....省略
}

由于是聚合工程,
工具类放在了cpms-common

cpms-auth-service 依赖cpms-common

    public class UserAuthenBuilder {
    /**
     *  认证类型缓存池
     */
    private static Map<String, IAuthen> authenPool = new ConcurrentHashMap<>();
    static {
        System.out.println("初始.....");
        authenPool.put(SysAdminAuthen.AUTHEN_TYPE, SpringUtil.getBean(SysAdminAuthen.class));
        authenPool.put(WxMiniAuthen.AUTHEN_TYPE, SpringUtil.getBean(WxMiniAuthen.class));
    }

    public static IAuthen getAuthenType(String authenType){
        return authenPool.get(authenType);
    }
}

调用cpms-auth-service 接口,接口中有用到getAuthenType这个方法,然后直接报错:
Could not initialize class com.cpms.auth.authen.UserAuthenBuilder";

并且工具类中的上下文属性 applicationContext 这个也报空指针异常

【注】但是把工具类直接挪到cpms-auth-service模块,可以正常使用

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

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

发布评论

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

评论(2

挖鼻大婶 2022-09-20 00:08:34

楼上说得对,static代码块和ApplicationContextAware 接口的回调的先后不同,
如果你只是要丢两个数据进去,在getAuthenType之前加一个判断,如果map是空的,就执行你static代码快里面的代码;或者UserAuthenBuilder 交给容器管理,这就很随意了,都能实现你需要

裂开嘴轻声笑有多痛 2022-09-20 00:08:34

你看一下 static {} 代码块的触发时间,如果早于 spring boot 工程的初始化完成时间肯定就不对了,那个时候 applicationContext 根本就不存在。

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