Джерси: добавление компонента Spring в ContainerRequestFilter - PullRequest
5 голосов
/ 20 сентября 2010

Я использую Jersey 1.4 ea вместе с Spring 3.0 и интеграцией jersey-spring. Интеграция Джерси и Спринг отлично работает для классов ресурсов, как описано здесь . Как бы то ни было, я хочу добавить пружинный компонент в ContainerRequestFilter , чтобы выполнить некоторую предварительную обработку запросов.

@Component
public class SecurityFilter implements ContainerRequestFilter {

    // UserManager is a declared spring component
    // Injecting it should work somehow
    @Autowired
    private UserManager userManager;

    @Override
    public ContainerRequest filter(ContainerRequest request) {
        System.out.println(userManager);
        // prints out null on request
    }
}

Фильтр и bean-компонент user manager регистрируются при развертывании приложения в Glassfish. Интересно, что я делаю не так? Есть ли способ внедрить управляемый пружиной bean-компонент в ContainerRequestFilter?

UPDATE

Вид решен. Проблема заключается в том, что Jersey не получает бины Spring, если эти бины являются прокси-серверами Java (в отличие от сгенерированных прокси-классов). Эту проблему можно решить, дав команду Spring ВСЕГДА использовать прокси-классы вместо Java Proxies, указав атрибут proxy-target-class="true" в соответствующих частях конфигурации Spring. В моем сценарии я должен был указать это на <tx:annotation-driven proxy-target-class="true" />.

См. здесь для более подробного анализа и возможного исправления этого.

1 Ответ

2 голосов
/ 29 марта 2011

Я вижу то же самое с Джерси 1.6 и весной 3.0.5. Используя отладчик, я могу сказать, что, хотя мой код помечен @Component, Spring и Jersey будут создавать свои собственные копии этого класса:

@Path("/beams")
@Produces("text/xml")
@Component
@Scope("singleton")
public class BeamsResource {
}

Существует некоторая болтовня о том, что это будет добавлено в будущей версии Джерси, но, похоже, сейчас это не работает. Я знаю, что это отвратительное решение, но я пока использую статическую переменную-член, чтобы связать Джерси и Спринг. BLEH.

...