2012-03-13 65 views
11

我試圖注入一個spring bean到過濾器,但不能使它的工作。春天和@Autowired DelegatingFilterProxy

注入的bean始終爲「null」。我成功地在Controllers和HandlerInterceptors中自動裝配了這個相同的bean,所以它的註釋是正確的。

該過濾器類與其餘控制器的基本包相同。

這是我的web.xml

<filter> 
    <filter-name>CheckSession</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
    </filter> 
    <filter-mapping> 
    <filter-name>CheckSession</filter-name> 
    <url-pattern>/panel/*</url-pattern> 
    </filter-mapping> 

的相關部分。這是過濾

@Component 
public class CheckSession extends OncePerRequestFilter implements Filter { 

    @Autowired private Usuario usuario; 

    @Override 
    protected void doFilterInternal(
     HttpServletRequest request, 
     HttpServletResponse response, FilterChain chain) 
    throws ServletException, IOException { 

     // always null 
     System.out.println("autowired " + usuario); 
     chain.doFilter(request, response); 
    } 
} 

的過濾器在每個請求觸發的代碼。

這些都是在 「Usuario」 豆

@Component 
@Scope(value="session", proxyMode=ScopedProxyMode.TARGET_CLASS) 
public class Usuario implements java.io.Serializable { ... } 

我失去了什麼註解?謝謝!

+0

不該引用'你在'過濾級'中使用你的確切類名嗎?你確定你的過濾器是由Spring管理的嗎?你不應該在這裏使用@Configurable嗎? – skegg99 2012-03-13 21:07:17

+0

過濾器的名稱是CheckSession,與「過濾器名稱」中指示的相同。如果我在「filter-name」中更改該名稱,則會從Spring中獲取「NoSuchBeanDefinitionException」。所以我想是的,過濾器是由Spring管理的(通過DelegatingFilterProxy),但autowire機制仍然不工作...:( – metacortechs 2012-03-13 21:51:44

回答

9

儘量明確地爲您CheckSession的bean定義名稱,並看看是否有幫助......像這樣:

@Component("CheckSession") 
public class CheckSession extends OncePerRequestFilter implements Filter { 
    @Autowired private Usuario usuario; 

    @Override 
    protected void doFilterInternal(HttpServletRequest request, 
      HttpServletResponse response, FilterChain chain) 
      throws ServletException, IOException { 

     // always null 
     System.out.println("autowired " + usuario); 
     chain.doFilter(request, response); 
    } 
} 

的關鍵部分是這樣的:@Component( 「CheckSession」)

而且爲了讓事情更漂亮,更容易處理,我將camelCase這個名字並將它重新命名爲「checkSession」(大寫第一個字母)。

+0

這對我有效,我有同樣的問題 – codemonkeyww 2013-01-22 17:53:03

+1

這並不工作雖然過濾器被掃描,但自動裝置仍然不起作用 – Rahul 2013-12-23 10:47:51

+0

+1在這裏工作得很好 – 2014-01-27 20:56:09

7

工程於Spring 3.2.6:

第一:名稱您的組件,2個選項 - 只做一

選項A:註釋 - 假定組件掃描啓用

@Component("checkSession") 
public class CheckSession extends OncePerRequestFilter { 

@Autowired 
Usuario usuario; 

@Override 
protected void doFilterInternal(final HttpServletRequest request, final HttpServletResponse response, final FilterChain chain) throws ServletException, IOException { 

    // not null 
    System.out.println("autowired " + usuario); 
    chain.doFilter(request, response); 
    } 
} 

選項B:通過appliationContext.xml線豆

<bean id="checkSession" class="com.example.filter.CheckSession"></bean> 

二:線簧的DelegatingFilterProxy

<filter> 
    <filter-name>checkSession</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>checkSession</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

注:bean的名稱爲filter-name

+0

我面臨同樣的問題,我正在使用spring-boot。如何在spring-boot中配置過濾器,因爲我沒有web.xml來配置像這樣過濾? – kaluva 2016-02-19 18:23:55