Spring и @Autowired на делегированииFilterProxy
Я пытаюсь ввести spring bean в фильтр, но не могу заставить его работать.
Вводимый bean всегда имеет значение "null". Мне удалось автоматизировать этот же bean в контроллерах и 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);
}
}
Фильтр запускается при каждом запросе.
Это аннотации в "Usuario" bean
@Component
@Scope(value="session", proxyMode=ScopedProxyMode.TARGET_CLASS)
public class Usuario implements java.io.Serializable { ... }
Что мне не хватает? Спасибо!
Ответы
Ответ 1
Попробуйте явно определить имя вашей 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" всюду (де-капитализировать первую букву).
Ответ 2
Работает на 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: провод bean через appliationContext.xml
<bean id="checkSession" class="com.example.filter.CheckSession"></bean>
Второе: Подключить Spring 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