2012-03-13 2 views
11

Я пытаюсь вставлять пружинный компонент в фильтр, но не могу заставить его работать.Spring и @Autowired on DelegatingFilterProxy

Введенный bean-компонент всегда «null». Мне удалось автоувеличивать этот же компонент в контроллерах и HandlerInterceptors, чтобы он был правильно аннотирован.

Класс фильтра находится под тем же базовым пакетом остальных контроллеров.

Это соответствующая часть моей 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); 
    } 
} 

Фильтр запускающего по каждому запросу.

Это аннотации в «бобе» Новичок

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

Что мне не хватает? Благодаря!

+0

не должен Вы используете точное имя класса в 'filter-class'? И вы уверены, что ваш фильтр управляется весной? Разве вы не используете @Configurable здесь? – skegg99

+0

Имя фильтра - CheckSession, то же, что указано в «filename». Если я изменю это имя в «filename», я получаю «NoSuchBeanDefinitionException» из Spring. Так что я думаю, да, фильтр управляется Spring (через DelegatingFilterProxy), но механизм autowire все еще не работает ...:( – metacortechs

ответ

9

Попробуйте явно указать имя для вашего CheckSession фасоли и посмотреть, если это помогает ... Как это:

@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")

И чтобы сделать вещи красивее и легче справиться с дорогой, я бы назвал это имя и переименовал его в «checkSession» всюду (де-капитализировать первую букву).

+0

Это сработало для меня, и у меня была та же проблема. – codemonkeyww

+1

Это вообще не работает. Хотя фильтр отсканирован, но автоустановка все еще не работает – Rahul

+0

+1 Хорошо работает здесь! –

7

Работы по весне 3.2.6:

Первое: Имя ваш компонент, 2 варианта - сделать только один

Вариант А:Аннотация - предполагает компонент сканирования включен

@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> 

Примечания: название боб упоминается как filter-name

+0

У меня такая же проблема. Я использую Spring-boot. Как настроить фильтр в Spring-Boot, так как у меня нет web.xml для настройки фильтр вроде этого? – kaluva