2010-09-19 9 views
5

Я использую Jersey 1.4 ea вместе с Spring 3.0 и интеграцию jersey-spring. Интеграция Jersey и Spring отлично подходит для классов ресурсов, как описано here. Как бы то ни было, я хочу ввести весенний компонент в ContainerRequestFilter, чтобы выполнить некоторую предварительную обработку запросов.Джерси: компонент Inject 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 
    } 
} 

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

ОБНОВЛЕНИЕ

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

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

+0

В вашем решении, как этот SecurityFilter был зарегистрирован в файле web.xml или где-то еще? У меня есть проблема здесь https://stackoverflow.com/q/45509183/4636715, в которой ContainerRequestFilter вообще не посещается. – vahdet

ответ

2

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

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

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

+1

Наконец-то я нашел решение для этого. Отладив код, оказалось, что это проблема в том, как Джерси получает весенние бобы из контекста. Мои мысли документированы http://jersey.576304.n2.nabble.com/AW-Jersey-ContainerRequestFilter-as-Spring-component-td5724265.html – nre

+0

См. Также обновление по моему вопросу. – nre