Spring и @Autowired на DelegatingFilterProxy - PullRequest
11 голосов
/ 13 марта 2012

Я пытаюсь добавить пружинный боб в фильтр, но не могу заставить его работать.

Внедренный компонент всегда "нулевой". Мне удалось автоматически подключить этот же bean-компонент в Controllers и 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 { ... }

Что мне не хватает? Спасибо!

Ответы [ 2 ]

9 голосов
/ 23 марта 2012

Попробуйте явно определить имя для вашего bean-компонента 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")

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

7 голосов
/ 20 января 2014

Работает на 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: Wire Bean через 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

...