2012-03-13 11 views
11

Próbuję wstrzyknąć fasolę wiosenną do filtra, ale nie mogę jej uruchomić.Wiosna i @Apiowi na DelegatingFilterProxy

Wstrzyknięta fasola ma zawsze wartość "null". Udaje mi się wyposażyć ten sam komponent w Kontrolery i HandlerInterceptory, więc jest poprawnie adnotowany.

Klasa filtra znajduje się pod tym samym pakietem podstawowym co pozostałe kontrolery.

To jest odpowiednia część mojego 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> 

Jest to kod dla filtra

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

Filtr wyzwalającego na każde żądanie.

Są to adnotacje w "usuario" fasoli

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

Czego mi brakuje? Dzięki!

+0

shouldn użyjesz dokładnej nazwy klasy w "klasie filtrów"? Czy jesteś pewien, że twój filtr jest zarządzany przez Spring? Nie powinieneś używać tutaj @Configurable? – skegg99

+0

Nazwa filtra to CheckSession, taka sama, jak wskazano w "nazwa-filtra". Jeśli zmienię tę nazwę w "filter-name", otrzymam "NoSuchBeanDefinitionException" ze Spring. Więc tak, filtr jest zarządzany przez Spring (przez DelegatingFilterProxy), ale mechanizm autowire nadal nie działa ...:( – metacortechs

Odpowiedz

9

Spróbuj jawnie określić nazwę CheckSession fasoli i sprawdzić, czy to pomaga ... Jak to:

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

Kluczowym elementem jest taka: @Component ("CheckSession")

I aby sprawić, że będzie ładniej i łatwiej będzie sobie z nimi poradzić, będę musiał podać nazwę i zmienić jej nazwę na "checkSession" wszędzie (odinstaluj pierwszą literę).

+0

To działało dla mnie i miałem ten sam problem – codemonkeyww

+1

To nie działa w ogóle. Chociaż filtr zostanie zeskanowany, ale program wciąż nie działa – Rahul

+0

+1 Działa tutaj bardzo dobrze! –

7

działa na wiosnę 3.2.6:

pierwsze: Nazwa komponent, 2 opcje - zrobić tylko jeden

Wariant A:Adnotacja - zakłada komponentu obsługującego skanowanie

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

Wariant B:drut fasola poprzez appliationContext.xml

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

drugie: drutu up Wiosna 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> 

Uwagi: nazwa fasola odwołuje jako filter-name

+0

Mam do czynienia z tym samym problem. Używam spring-boot.Jak skonfigurować filtr w rozruchu wiosennego, ponieważ nie mam web.xml do skonfigurowania filtrować w ten sposób? – kaluva