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