Spring 注入在 Jersey 过滤器中不起作用 - @InjectParam 在 jersey2 中等效
Spring Injection isn't working in Jersey Filter - @InjectParam Equivalent in jersey2
我正在尝试使用 spring 注入在 Jersey-Filter 中注入一个对象。
如果我尝试 @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[=11=]0(ServiceLocatorImpl.java:120)
at org.jvnet.hk2.internal.ServiceLocatorImpl.compute(ServiceLocatorImpl.java:186)
at org.jvnet.hk2.internal.ServiceLocatorImpl.compute(ServiceLocatorImpl.java:182)
如果我尝试使用它在 Jersey 1.x 中定义的 @InjectParam 但是我使用的是 Jersey 2.17,其中找不到此注释。
知道如何在 jersey-filter 中执行此 spring 注入吗?
异常是什么意思?
Could not find an active context for org.jvnet.hk2.spring.bridge.api.SpringScope
更新编辑:
此外,您可以提供构造函数注入。 Jersey 的构造函数注入在 Filter 中对我有用,而不是 Field Injections
旧:
我通过在过滤器中注入 javax.servlet.ServletContext 并使用它来使用 WebApplicationContextUtils[= 获取 beanId 来实现这一点12=]
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);
并且通过包含 spring 侦听器,因此 spring 初始化首先发生。
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
这行得通。
但是我不是注入而是显式加载依赖项。
有没有更好的方法来做到这一点?
我正在尝试使用 spring 注入在 Jersey-Filter 中注入一个对象。
如果我尝试 @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[=11=]0(ServiceLocatorImpl.java:120)
at org.jvnet.hk2.internal.ServiceLocatorImpl.compute(ServiceLocatorImpl.java:186)
at org.jvnet.hk2.internal.ServiceLocatorImpl.compute(ServiceLocatorImpl.java:182)
如果我尝试使用它在 Jersey 1.x 中定义的 @InjectParam 但是我使用的是 Jersey 2.17,其中找不到此注释。
知道如何在 jersey-filter 中执行此 spring 注入吗?
异常是什么意思?
Could not find an active context for org.jvnet.hk2.spring.bridge.api.SpringScope
更新编辑: 此外,您可以提供构造函数注入。 Jersey 的构造函数注入在 Filter 中对我有用,而不是 Field Injections
旧:
我通过在过滤器中注入 javax.servlet.ServletContext 并使用它来使用 WebApplicationContextUtils[= 获取 beanId 来实现这一点12=]
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);
并且通过包含 spring 侦听器,因此 spring 初始化首先发生。
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
这行得通。 但是我不是注入而是显式加载依赖项。 有没有更好的方法来做到这一点?