The problem and solution of not injecting bean into Filter

  • 2021-12-12 04:26:43
  • OfStack

Problem that bean cannot be injected in directory Filter; Invalid injection of bean in Filter is the solution to the cause of null problem

Problem that bean cannot be injected into Filter


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

Invalid injection of bean in Filter is null

Causes of the problem

The startup sequence of Web applications is:

Lisenter- > Fliter- > Servlet, application context, when initializing Fliter, Servlert has not been initialized, and all of them have not entered the initialization of DispacterServlet, so annotations are used in Fliter to inject bean as empty;

Solution

Add the initialization bean configuration and manually create the object new

The code is as follows:


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 is a manually created bean, which implements Filter interface


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;  
}

At this time, the value can be obtained by using @ Value annotation in RequestFilter, and the corresponding bean will be obtained by injecting bean.

At this point, the problem is solved!

Conclusion: No matter what you do, you must first understand his principle, otherwise, if you solve the problem, you will not meet it next time!


Related articles: