springBoot过滤器注入Bean的空指针问题

问题记录 专栏收录该内容
8 篇文章 0 订阅
   在过滤器中的doFilterInternal写业务代码时,需要用到spring bean组件,发现在过滤器中无法初始化bean组件,均为NullpointException,经检查扫描包路径没问题。最终确定容器加载顺序引发的问题,在web.xml中各个元素的执行顺序是这样的,context-->param-->listener-->filter-->servlet可以看出在spring MVC 的dispatcherServlet初始化之前过滤器就已经加载好了,所以注入的是null。

  解决思路是doFilterInternal使用spring上下文取获取相应的bean组件,对于Spring Boot我们可以使用以下步骤来解决

  第一步:创建上下文工具类SpringContextUtil

@Component
public class SpringContextUtil implements ApplicationContextAware {

    private static ApplicationContext context = null;

   
    //设置上下文
    @Override
    public void setApplicationContext(ApplicationContext applicationContext)
            throws BeansException {
        SpringContextUtil .context = applicationContext;
    }

    //获取上下文
    public static ApplicationContext getApplicationContext(){
        return context; 
    }


    // 通过名字获取上下文的Bean
    public static <T> T getBean(String beanName) {
        return (T) context.getBean(beanName);
    }

    //通过类型获取上下文的bean
    public static <T> T setBean(Class<?> requiredType){
        return applicationContext.getBean(requireType);
    }
    

    // 国际化使用
    public static String getMessage(String key) {
        return context.getMessage(key, null, Locale.getDefault());
    }

    // 获取当前环境
    public static String[] getActiveProfiles() {
        return context.getEnvironment().getActiveProfiles();
    }

    // 判断当前环境是否为test/local
    public static boolean isDevEnv(){
        String[] activeProfiles = getActiveProfiles();
        if (activeProfiles.length<1){
            return false;
        }
        for (String activeProfile : activeProfiles) {
            if (StringUtils.equals(activeProfile,"dev")){
                return true;
            }
        }
        return false;
    }
}

  第二步:若没有继承ApplicationContextAware ,在Springboot启动类的main方法中,向上下文工具类SpringContextUtil中注入applicationContext

 

  第三步:在相应的业务代码中 使用SpringContextUtil.getBean("xxx") 获取相应的bean组件即可,如:

 

  • 0
    点赞
  • 4
    评论
  • 5
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值