在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。

至此问题解决!

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

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

相关文章

  • SpringBoot中OKHttp和压缩文件的使用实战教程

    SpringBoot中OKHttp和压缩文件的使用实战教程

    本文介绍了如何在SpringBoot中使用OKHttp发起请求和处理压缩文件,包括文件的存储配置、实体类、配置类和初始化类的设置,以及如何通过主程序和测试类进行实际操作,最后提供了必要的依赖添加方法,以确保功能的实现
    2024-10-10
  • SpringBoot集成Validation参数校验

    SpringBoot集成Validation参数校验

    这篇文章主要为大家详细介绍了SpringBoot集成Validation参数校验,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • JavaWeb中的filter过滤敏感词汇案例详解

    JavaWeb中的filter过滤敏感词汇案例详解

    敏感词、文字过滤是一个网站必不可少的功能,本篇文章主要介绍了JavaWeb中的filter过滤敏感词汇案例,具有一定的参考价值,有需要的可以了解一下,
    2016-11-11
  • Springboot MongoDB实现自增序列的项目实践

    Springboot MongoDB实现自增序列的项目实践

    在某些特定的业务场景下,会需要使用自增的序列来维护数据,本文主要介绍了Springboot MongoDB实现自增序列的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • Java中的StringJoiner类使用示例深入详解

    Java中的StringJoiner类使用示例深入详解

    这篇文章主要为大家介绍了Java中的StringJoiner类使用示例深入详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • Spring Security自定义登录页面认证过程常用配置

    Spring Security自定义登录页面认证过程常用配置

    这篇文章主要为大家介绍了Spring Security自定义登录页面认证过程常用配置示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • MyBatis insert操作插入数据之后返回插入记录的id

    MyBatis insert操作插入数据之后返回插入记录的id

    今天小编就为大家分享一篇关于MyBatis插入数据之后返回插入记录的id,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • SpringBoot访问MongoDB数据库的两种方式

    SpringBoot访问MongoDB数据库的两种方式

    MongoDB是一种非关系型数据库,通过文档存储数据,适用于大规模数据存储和高并发访问,这篇文章主要介绍了SpringBoot访问MongoDB数据库的两种方式,感兴趣想要详细了解可以参考下文
    2023-05-05
  • java虚拟机jvm方法区实例讲解

    java虚拟机jvm方法区实例讲解

    在本篇文章里小编给大家整理的是一篇关于java虚拟机jvm方法区实例讲解内容,有兴趣的朋友们可以学习下。
    2021-02-02
  • .NET程序员如何入门Spring Boot详解

    .NET程序员如何入门Spring Boot详解

    这篇文章主要介绍了.NET程序员如何快入门Spring Boot,微软给VS Code提供了编写Java的插件,你可以在VS Code上愉快地写Java。,需要的朋友可以参考下
    2019-06-06

最新评论