将@WebFilter和@Component注释添加到Spring Filter

时间:2016-06-16 06:46:18

标签: java spring

我有一个Filter类' MyFilter'这是通过@WebFilter注释注册的。在doFilter()我需要一个我在项目中创建的MyBeanClass对象。如果我通过new运算符创建此对象,并在tomcat上运行该项目,我看到过滤器已注册一次并且工作正常。

但是,当我尝试通过在@Component类上面添加MyFilter注释来自动装配对象,然后在tomcat上运行项目时,我看到过滤器已注册两次。{{1调用两次,第二次doFilter()被调用doFilter()的对象未初始化且为MyBeanClass。因此null

我需要将依赖注入保留到Spring,因此需要自动装配对象。关注点是 -

  1. 为什么过滤器已注册两次。
  2. 为什么对象第二次为空。
  3. 实现这一目标的正确方法是什么。
  4. 以下是示例代码: MyFilter.java:

    NullPointerException

    MyBeanClass.java

    @Component
    @WebFilter(filterName = "RestFilter", urlPatterns = { "/*" })
    public class MyFilter implements Filter {
    
        @Autowired
        MyBeanClass myBeanClass;
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            //this is how I know that filter is registered twice.
            System.out.println("this is init.");  
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
            if (myBeanClass.isValidRequest()) {
                System.out.println("Let this request pass");
                chain.doFilter(request, response);
            }
            else{
                System.out.println("Should not let pass this request");
            }
        }
    
        @Override
        public void destroy() {
            // TODO Auto-generated method stub
    
        }
    }
    

    我是Spring框架的新手,最近开始在Spring开发一个项目。如果我做错了,请纠正我。或者,如果有其他方法可以做到这一点,请将我引导到正确的资源。

1 个答案:

答案 0 :(得分:-1)

这是因为您在Application类中添加了@ServletComponentScan,并在过滤器上使用了@Component。你可以删除其中任何一个。

顺便说一句,如果您使用@component@webfilter将无效