Уведомление Spring о фильтре Jersey

У меня есть класс, который реализует ContainerRequestFilter, я хочу внедрить в него некоторые зависимости Spring, поэтому мне нужно, чтобы Spring знал о фильтре Jersey. Сам фильтр настроен в моем файле web.xml с помощью сервлета из Джерси.

<servlet>
    <servlet-name>Jersey Spring Web Application</servlet-name>
    <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
        <param-value>com.MyFilter</param-value>
    </init-param>
</servlet>

Затем класс фильтра пытается внедрить bean-компонент Manager. Чтобы Spring знал о bean-компоненте Filter, я определил bean-компонент в своем applicationContext.xml и включил его.

@Component
public class MyFilter implements ContainerRequestFilter {

@Autowired
private Manager manager;

Я попытался сделать компонент фильтра видимым, заставив Spring использовать классы, сгенерированные прокси, однако это не работает.

<mvc:annotation-driven />

<aop:aspect-autoproxy />    

<bean id="filter" class="com.MyFilter">
    <property name="manager" ref="Manager" />
</bean>

Любые предложения о том, как я могу отредактировать существующий код, чтобы фильтр мог видеть весенние бобы?


person cdugga    schedule 22.03.2013    source источник


Ответы (2)


Это то, что довольно часто встречается в приложениях Spring Security. Вам следует использовать DelegatingFilterProxy для этого.

Вы добавите этот фильтр в свой файл web.xml с помощью тега <filter>, а затем настроите его как bean-компонент в своем контейнере приложения. Затем вы можете использовать его для делегирования настроенному фильтру Spring, который у вас есть в контексте вашего приложения.

Я не знаком с тем, как работает SpringServlet в Джерси, но именно так я делегировал бы фильтр, настроенный Spring.

person nicholas.hauschild    schedule 22.03.2013

Поскольку вы используете Spring Servlet Джерси, Spring-зависимости могут быть введены в фильтр с помощью аннотации @InjectParam

//@Component -> This is not required.
public class MyFilter implements ContainerRequestFilter {

@InjectParam
private Manager manager;

Я чувствую, что это идиоматический способ использования Jersey и Spring вместе.

person Dhruv Chandna    schedule 11.09.2013
comment
У меня работает @InjectParam, но если я удалю <param-value> из web.xml, Джерси не загрузит фильтр. - person Adrian Cox; 30.12.2013
comment
Когда я добавляю @InjectParam, я получаю СЕРЬЕЗНУЮ: ошибка отсутствия зависимости; внедрение из Spring в классы ресурсов с @Inject работает (но @Inject не улавливается фильтрами контейнера). Есть ли какой-то шаг, который я пропустил? - person Jakub Bochenski; 15.09.2014