在Filter中不能注入bean的问题及解决

 更新时间:2021年11月15日 14:58:05   作者:hehuijava  
这篇文章主要介绍了在Filter中不能注入bean的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Filter中不能注入bean的问题

WebApplicationContext webApplicationContext = WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext());
ApiController apiController = (ApiController) webApplicationContext.getBean("apiController");

Filter中注入bean 无效为null

问题原因

Web应用的启动顺序是:

Lisenter->Fliter->Servlet, 应用程序上下文, 初始化 Fliter的时候,还没有初始化Servlert,所有没有进入DispacterServlet的初始化,故在Fliter中使用注解注入bean为空;

解决办法

添加初始化bean配置,手动创建对象new

代码如下:

package com.test.config; 
import com.alibaba.druid.support.http.StatViewServlet;
import com.test.service.RequestFilter;
import javax.servlet.Filter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.filter.DelegatingFilterProxy;
 
/**
 * @author lucasliang
 * @date 08/11/2018 5:56 afternoon filter load before dispathServlet ,so load RequestFilter as a
 * bean,new a RequestFilter
 */
@Configuration
public class FilterConfig {
 
  /*
    *@param: []
    *@return javax.servlet.Filter
    *@author lucasliang
    *@date 20/12/2018
    *@Description filter
   */
  @Bean
  public Filter uploadFilter() {
    return new RequestFilter();
  } 
 
  /*
    *@param: []
    *@return org.springframework.boot.web.servlet.FilterRegistrationBean
    *@author lucasliang
    *@date 20/12/2018
    *@Description filter
   */
  @Bean
  @SuppressWarnings("unchecked")
  public FilterRegistrationBean testFilterRegistration() {
    FilterRegistrationBean registration = new FilterRegistrationBean();
    registration.setFilter(new DelegatingFilterProxy("uploadFilter"));
    registration.addUrlPatterns("/*");
    registration.addInitParameter("paramName", "paramValue");
    registration.setName("testFilter");
    registration.setOrder(1);
    registration.setEnabled(false);
    return registration;
  } 
}

其中RequestFilter是手动创建的bean,实现了Filter接口

package com.test.service; 
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig; 
 
public class RequestFilter implements Filter { 
  private Logger logger = LoggerFactory.getLogger(Filter.class);  
  @Value(value = "${encodeRules}")
  private String encodeRules;  
}

此时,在RequestFilter中使用@Value注解,就可以取到值了,注入bean也相同,会取到对应的bean。

至此问题解决!

总结:不管做什么事,首先要搞清楚他的原理,要不,解决了问题下次遇到了还是不会!

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java简单实现数组中的逆序对

    java简单实现数组中的逆序对

    这篇文章主要为大家详细介绍了java简单实现数组中的逆序对,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-03-03
  • 如何使用BufferedReader循环读文件

    如何使用BufferedReader循环读文件

    这篇文章主要介绍了如何使用BufferedReader循环读文件的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • 关于Java中的dozer对象转换问题

    关于Java中的dozer对象转换问题

    Dozer是Java Bean到Java Bean映射器,它以递归方式将数据从一个对象复制到另一个对象,这篇文章主要介绍了Java中的dozer对象转换的操作方法,需要的朋友可以参考下
    2022-08-08
  • 如何用java实现分页查询

    如何用java实现分页查询

    这篇文章主要介绍了如何用java实现分页查询,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-06-06
  • java如何获取map中value的最大值

    java如何获取map中value的最大值

    这篇文章主要介绍了java如何获取map中value的最大值问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • 详解Java反射创建对象

    详解Java反射创建对象

    今天带大家学习Java的基础知识,文中对Java反射创建对象作了非常详细的介绍及代码示例,对正在学习Java的小伙伴们很有帮助,需要的朋友可以参考下
    2021-05-05
  • mybatis批量插入返回主键失败的坑及解决

    mybatis批量插入返回主键失败的坑及解决

    这篇文章主要介绍了mybatis批量插入返回主键失败的坑及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • 在Java中判断两个Long对象是否相等

    在Java中判断两个Long对象是否相等

    这篇文章主要介绍了在Java中判断两个Long对象是否相等的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Java利用DOM解析XML的学习指南

    Java利用DOM解析XML的学习指南

    在Java中使用DOM解析XML文件是一个常见的操作,它允许你以编程方式读取、修改和保存XML文档的结构和内容,本文为大家介绍了具体的实现步骤,有需要的小伙伴可以参考下
    2025-04-04
  • Java实现截取视频第一帧的示例详解

    Java实现截取视频第一帧的示例详解

    在实际项目中,会遇到上传视频后,需要截取视频的首帧或指定帧为图片,作为展示使用的需求,下面小编就来为大家介绍一下如何使用Java实现截取视频第一帧吧
    2025-03-03

最新评论