2016-03-02 1 views
3

Я пытаюсь ввести объект в Jersey-Filter, используя пружинную инъекцию.Spring Injection не работает в фильтре Джерси - @InjectParam Эквивалент в jersey2

Если я попробовать метод @Inject, то я в конечном итоге с исключением

SEVERE: StandardWrapper.Throwable 
MultiException stack 1 of 2 
java.lang.IllegalStateException: Could not find an active context for org.jvnet.hk2.spring.bridge.api.SpringScope 
     at org.jvnet.hk2.internal.ServiceLocatorImpl._resolveContext(ServiceLocatorImpl.java:2058) 
     at org.jvnet.hk2.internal.ServiceLocatorImpl.access$000(ServiceLocatorImpl.java:120) 
     at org.jvnet.hk2.internal.ServiceLocatorImpl$2.compute(ServiceLocatorImpl.java:186) 
     at org.jvnet.hk2.internal.ServiceLocatorImpl$2.compute(ServiceLocatorImpl.java:182) 

Если я пытаюсь использовать @InjectParam что его определено в Джерси 1.x, однако я используя Jersey 2.17, в котором эта аннотация не найдена.

Любая идея, как выполнить эту пружинную инъекцию в джерси-фильтр?

Что означает исключение?

Could not find an active context for org.jvnet.hk2.spring.bridge.api.SpringScope

+0

Мне кажется, что во время инициализации пружинный мост не был правильно инициализирован. Я не уверен, как это делается на Джерси, но вы можете увидеть больше о мосте spring/hk2 здесь: https://hk2.java.net/2.5.0-b03/spring-bridge.html – jwells131313

ответ

0

Update Edit: Кроме того, вы можете обеспечить внедрение конструктора. впрыскивание конструктора Джерси работало для меня в фильтре, а не полевая Инъекция

Старые:

Я реализовал это, Впрыскивание javax.servlet.ServletContext внутри фильтра и с помощью, чтобы получить beanIds с помощью WebApplicationContextUtils

public class LoginFilter implements ContainerRequestFilter { 

    @Context private HttpServletRequest servletRequest; 

    @Context private HttpServletResponse servletResponse; 

    @Context private ServletContext servletContext; 

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 

     try { 

      WebApplicationContext springContext = 
        WebApplicationContextUtils.getWebApplicationContext(servletContext); 

      CookieAuthenticator  cookieAuthenticator = springContext.getBean(CookieAuthenticator.class); 

      LoginInterceptorHelper loginInterceptorHelper = springContext.getBean(LoginInterceptorHelper.class); 

      HttpSession session = request.getSession(true); 

      UserSummary user = (UserSummary) session.getAttribute(WebConstants.USER_DETAIL); 

И Включив пружинный слушателя так инициализация пружины происходит первым.

<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

Это работает. Но вместо инъекции я явно загружаю зависимости. Есть ли лучший способ сделать это?

Смежные вопросы