Осъзнаване на пролетта за филтъра Джърси

Имам клас, който имплементира ContainerRequestFilter, искам да инжектирам някои пролетни зависимости в него, така че трябва да осведомя Spring за филтъра Jersey. Самият филтър е конфигуриран в моя web.xml със сервлета Jersey

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

След това класът на филтъра се опитва да инжектира компонента Manager. За да осведомя пролетта за филтърния компонент, дефинирах компонента в моя 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 на Jersey, но това е начинът, по който бих делегирал на Spring конфигуриран филтър.

person nicholas.hauschild    schedule 22.03.2013

Тъй като използвате Spring Servlet на Jersey, зависимостите от spring могат да бъдат инжектирани във филтъра с помощта на анотацията @InjectParam

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

@InjectParam
private Manager manager;

Чувствам, че това е идиоматичният начин за използване на Джърси и Пролет заедно.

person Dhruv Chandna    schedule 11.09.2013
comment
@InjectParam работи за мен, но ако премахна <param-value> от web.xml Jersey не зарежда филтъра. - person Adrian Cox; 30.12.2013
comment
Когато добавя @InjectParam, получавам ТЕЖКА грешка: липсваща зависимост; инжектирането от Spring в класове ресурси с @Inject работи (но @Inject не се улавя във филтрите на контейнера). Има ли някаква стъпка, която пропускам? - person Jakub Bochenski; 15.09.2014