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

目录
  • Filter中不能注入bean的问题
  • Filter中注入bean 无效为null
    • 问题原因
    • 解决办法

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。

至此问题解决!

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

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

(0)

相关推荐

  • 在zuulFilter中注入bean失败的解决方案

    zuulFilter注入bean失败 一.为什么要用到这个 上周想实现在网关层 zuul 实现用户认证操作,即需要在网关过滤器中调用其他的微服务,按常规做法在 filter 中用 @Autowired 注解一个feign 接口,启动 一直失败,用度娘谷歌查了又查,只找到一些类似[在过滤器中注入bean]失败,但说的都是springMVC 并不是springcloud中的网关层 二.解决方法 查了很久,最终发现问题所在,其实在启动报错就提示很明显了,找不到相关实例,没错feign接口的实现类事实上

  • Springboot @WebFilter无法注入其他Bean的示例问题

    示例问题代码: @WebFilter(filterName = "authorizeFilter", urlPatterns = {"*.htm", "*.html"}, asyncSupported = true) public class AuthorizeFilter implements Filter { @Autowired private OtherBean otherBean; @Override public void init(

  • spring boot拦截器注入不了java bean的原因

    一.如何实现拦截器 在Spring Boot项目中,拦截器经常被用来做登陆验证,日志记录等操作.拦截器是Spring提供的,所以可以将拦截器注成bean,由IOC容器来管理.实现拦截器的方式很简单,主要由以下两个步骤: 自定义拦截器类实现HandlerInterceptor接口 自定义WebMvc配置类实现WebMvcConfigurer接口,添加自定义拦截器类 简要实现代码如下: 自定义拦截器 LoginInterceptor: public class LoginInterceptor im

  • Spring boot中filter类不能注入@Autowired变量问题

    目录 filter类不能注入@Autowired变量 问题描述 解决办法 @Component注入@Autowired为空 filter类不能注入@Autowired变量 问题描述 项目中的登录是用了shiro以及filter拦截器.输入正确的账号密码之后却不能正常登录.调试代码发现是filter类中定义的变量userService没有值,为null,该变量采用的方式是@Autowired自动注入.由此我认为shiro配置类还是有点问题. 解决办法 在shiroConfig.java(shiro

  • 关于SpringBoot拦截器中Bean无法注入的问题

    问题 这两天遇到SpringBoot拦截器中Bean无法注入问题.下面介绍我的思考过程和解决过程: 1.由于其他bean在service,controller层注入一点问题也没有,开始根本没意识到Bean无法注入是在拦截器中无效的问题,一直在查找注解指定的包在哪里配置的,然而却找不到配置,Springboot是用java类的形式加载配置的.在网络的某个角落看到这样的说法: SpringBoot项目的Bean装配默认规则是根据Application类所在的包位置从上往下扫描! "Applicati

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

    目录 Filter中不能注入bean的问题 Filter中注入bean 无效为null 问题原因 解决办法 Filter中不能注入bean的问题 WebApplicationContext webApplicationContext = WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext()); ApiController apiController = (ApiCo

  • Spring中如何动态注入Bean实例教程

    前言 在Spring中提供了非常多的方式注入实例,但是由于在初始化顺序的不同,基于标注的注入方式,容易出现未被正确注入成功的情况. 本文将介绍一种在实际项目中基于动态的方式来提取Spring管理的Bean. 下面话不多说了,来一起看看详细的介绍吧. 一.基于标注的方式注入实例 需要在Bean初始化之时,其依赖的对象必须初始化完毕.如果被注入的对象初始化晚于当前对象,则注入的对象将为null. 1.1 @Autowired 按照类型来加载Spring管理的Bean.默认情况下要求其Bean必须存在

  • 详解Spring中接口的bean是如何注入的

    Question: 这个问题困扰了我好久,一直疑问这个接口的bean是怎么注入进去的?因为只看到使用@Service注入了实现类serviceImpl,使用时怎么能获取的接口,而且还能调用到实现类的方法,难道这个接口是在什么时候自动注入了进去,且和实现类关联上了? 接口 public interface TestService { public String test(); } 实现类impl @Service public class TestServiceImpl implements Te

  • Java 如何从spring容器中获取注入的bean对象

    1.使用场景 控制层调用业务层时,控制层需要拿到业务层在spring容器中注入的对象 2.代码实现 import org.apache.struts2.ServletActionContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.suppo

  • 解决Test类中不能使用Autowired注入bean的问题

    目录 Test类中不能使用Autowired注入bean 在测试类中我自己使用的测试单元是 正确的应该是使用Spring-test里面的测试单元 Test包中使用autowired注入提示Could not autowire. No beans of 'xxx' type found. 将autowired注解换成Resource注解完美解决 Test类中不能使用Autowired注入bean 今天下午好好看了下关于Spring的注解问题. 在测试类中使用AutoWired注解一直不能获取到Be

  • 解决Spring在Thread中注入Bean无效的问题

    目录 在Thread中注入Bean无效 错误的注入方法 通过封装Thread子类注入 通过外部引入 Spring多线程中bean的注入问题 网上的主要解决方法有 在Thread中注入Bean无效 在Spring项目中,有时需要新开线程完成一些复杂任务,而线程中可能需要注入一些服务.而通过Spring注入来管理和使用服务是较为合理的方式.但是若直接在Thread子类中通过注解方式注入Bean是无效的. 因为Spring本身默认Bean为单例模式构建,同时是非线程安全的,因此禁止了在Thread子类

  • Spring拦截器中注入Bean失败解放方案详解

    目录 简介 问题重现 解决方案 简介 说明 本文用示例介绍如何解决拦截器中注入Bean失败的问题. 场景 Token拦截器中需要用@Autowired注入JavaJwtUtil类,结果发现注入的JavaJwtUtil为Null. 原因 拦截器的配置类是以new JwtInterceptor的方式使用的,那么这个JwtInterceptor不受Spring管理.因此,里边@Autowired注入JavaJwtUtil是不会注入进去的. 问题重现 代码 application.yml server:

  • Springboot项目中单元测试时注入bean失败的解决方案

    目录 Springboot项目中单元测试时注入bean失败 问题背景 问题描述 问题解决 Springboot单元测试,注入失败,报空指针错误 下面是测试类 Springboot项目中单元测试时注入bean失败 问题背景 最近公司项目搭了一个springboot项目进行开发,在单元测试时,由于生成项目后可能哪个同事把项目生产的test文件目录删了,也不知道是项目生成时test目录没有生成,需要自己建立一个test目录进行测试. 就是下图中的红框部分... 问题描述 在上图中的test目录建好之后

随机推荐