我可以在自定义过滤器中使用@Autowired吗

Dev*_*per 5 java spring-boot

我在自定义过滤器类中使用@Autowire。我遇到空指针异常。

@Autowire 在过滤器中起作用吗?

这是代码:

public class MyFilter extends CustomFilter {

@Autowire
public MyClass myClass;

@Override
public String getInfo(){
return myClass.getMessage();
}
}
Run Code Online (Sandbox Code Playgroud)

这就是我在配置类中注册 bean 的方式

@Configuration
public class ConfigLoader{ 

@Bean
    public FilterRegistrationBean myFilterBean() {
      final FilterRegistrationBean filterBean = new FilterRegistrationBean();
      filterBean.setFilter(new MyFilter());
      filterBean.addUrlPatterns("/*");
      return filterBean;
    }
}
Run Code Online (Sandbox Code Playgroud)

自定义过滤器:

public abstract class CustomFilter implements Filter {

    public FilterConfig getFilterConfig() {
        return this.filterConfig;
    }

    public void setFilterConfig(FilterConfig filterConfig) {
        this.filterConfig = filterConfig;
    }

    public void init(FilterConfig filterConfig) throws ServletException {
        this.filterConfig = filterConfig;
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
            throws IOException, ServletException {
        chain.doFilter(req, resp);
        this.clearContext();
    }

    protected abstract String getInfo();
}
Run Code Online (Sandbox Code Playgroud)

Sel*_*dek 8

@Component为过滤器类添加注释。

@Component
public class MyFilter extends CustomFilter {

...
Run Code Online (Sandbox Code Playgroud)

让 Spring 创建过滤器 bean 并在配置中自动装配它:

@Configuration
public class ConfigLoader{ 

@Autowired
private MyFilter myFilter;

@Bean
    public FilterRegistrationBean myFilterBean() {
      final FilterRegistrationBean filterBean = new FilterRegistrationBean();
      filterBean.setFilter(myFilter);
      filterBean.addUrlPatterns("/*");
      return filterBean;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 是的。这就是为什么你必须用`@Component`来注释Myfilter。这就是为什么您必须将其“@Autowired”添加到配置中,而不是手动创建它。 (2认同)