Springboot Filter中注入bean无效为null问题

 更新时间:2024年05月17日 08:45:51   作者:l梁晴  
这篇文章主要介绍了Springboot Filter中注入bean无效为null问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

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

至此问题解决!

关于Spring中,注入的bean为null的情况

描述问题

在写项目的时候,写了一个工具类或者测试类,然后调用相关的service层或者dao层的bean,但是通通为null,为啥呢?

问题原因

两种情况会导致如此问题,一个是工具类中的方法为静态方法,静态方法调用了bean,但是由于spring的加载机制,是加载静态代码-》构造函数-》注入bean-》postconstuct的顺序执行,因此静态方法里调用的bean,并没有注入相应的bean,因此为空,所以会出现bean为null的情况。

另一种情况是,调用工具类的时候,new了一个工具类的实例,该应用里的实例都是交给spring IOC容器去看管维护的,现在突然new出来一个实例,spring IOC容器是没有去看管他的,所以并不在同一个上下文中,那么new出来的这个类里面的实例方法,当然也调用不到spring IOC上下文里的实例了,所以当你调用你new出来的实例的方法时候,该方法里调用的spring的bean,都是没有注入的对象的。

如何解决

解决办法同样有两种,针对上面说的第一个问题的解决办法是,使用注解@postconstruct的方法,手动注入bean,因为postconstruct的方法,在bean加载完成之后,init之前执行,所以在这个时间点,注入相应的bean对象,就会生效。

第二种方法是,直接把该工具类作为spring的一个bean组件,使用@component,在业务层调用的时候,也同样使用注入的方式注入该工具类,这样也可以解决问题了。

总结

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

相关文章

  • Java实现在线考试系统与设计(学生功能)

    Java实现在线考试系统与设计(学生功能)

    这篇文章主要介绍了Java实现在线考试系统与设计(学生功能),本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • SpringBoot中使用多线程的方法示例

    SpringBoot中使用多线程的方法示例

    这篇文章主要介绍了SpringBoot中使用多线程的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Java集合中的WeakHashMap、IdentityHashMap、EnumMap详解

    Java集合中的WeakHashMap、IdentityHashMap、EnumMap详解

    这篇文章主要介绍了Java集合中的WeakHashMap、IdentityHashMap、EnumMap详解,HashMap的key保留了对实际对象的强引用,这意味着只要HashMap对象不被销毁,还HashMap的所有key所引用的对象就不会被垃圾回收,需要的朋友可以参考下
    2023-09-09
  • java的四种常用输入方法你会几种

    java的四种常用输入方法你会几种

    这篇文章主要介绍了java四种常用输入方法的相关资料,分别是Scanner、System、命令行和JOptionPane,每种方法都有其特点和适用场景,文中提供了详细的代码示例,需要的朋友可以参考下
    2025-03-03
  • idea导入项目不显示maven侧边栏的问题及解决方法

    idea导入项目不显示maven侧边栏的问题及解决方法

    这篇文章主要介绍了idea导入项目不显示maven侧边栏的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • Maven安装过程图文详解

    Maven安装过程图文详解

    这篇文章主要介绍了Maven安装过程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2020-07-07
  • SpringCloud的Hystrix简单介绍

    SpringCloud的Hystrix简单介绍

    这篇文章主要介绍了SpringCloud的Hystrix简单介绍,SpringCloud Hystrix是Netflix开源的一款容错框架,具备服务降级,服务熔断,依赖隔离,监控(Hystrix Dashboard)等功能,同样具有自我保护能力,需要的朋友可以参考下
    2023-07-07
  • Java8中的类型注解浅析

    Java8中的类型注解浅析

    这篇文章主要介绍了Java8中的类型注解浅析,java8之前,注解只能是在声明的地方所使用,java8里面的注解则可以应用在任何地方,需要的朋友可以参考下
    2014-06-06
  • java中TreeMap排序的示例代码

    java中TreeMap排序的示例代码

    本篇文章主要介绍了java中TreeMap排序的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • SpringBoot详细讲解断言机制原理

    SpringBoot详细讲解断言机制原理

    断言Assertion是测试方法中的核心部分,用来对测试需要满足的条件进行验证。这些断言方法都是org.junit.jupiter.api.Assertions的静态方法。检查业务逻辑返回的数据是否合理。所有的测试运行结束以后,会有一个详细的测试报告
    2022-06-06

最新评论