当前位置: 首页 > 知识库问答 >
问题:

Spring Jersey将在请求范围的类上注入ContainerRequestContext

房子昂
2023-03-14

我已经看了很多帖子,似乎没有什么能像我喜欢的那样工作。

我想将一个对象从一个过滤器注入到ContainerRequestContext属性中,然后在其他类中检索它。

这是我的过滤器:

@Priority(Priorities.AUTHENTICATION)
public class AuthorizationFilter implements ContainerRequestFilter {

    @Override
    public void filter(ContainerRequestContext containerRequestContext) throws IOException {

        containerRequestContext.setProperty("myObject", new Object());
    }
}

下面是我想要访问ContainerRequestContext的类:

@Provider
public class SessionContextProvider implements ISessionContextProvider {
    @Context
    private ContainerRequestContext request;

    @Override
    public Object getSessionContext() {
        return request.getProperty("mySessionContext");
    }
}

我的spring配置:

@Bean(name="sessionContextProvider")
@Scope(value = "request", proxyMode = ScopedProxyMode.INTERFACES)
public ISessionContextProvider sessionContextProvider() {
    return new SessionContextProvider();
}

如果我将容器请求上下文注入到我的 Web 资源中,一切都按预期工作。但是,如果调用我的提供程序类容器请求上下文始终为空。

我似乎不知道为什么这不会奏效。

里格兹·乔纳斯

共有2个答案

呼延源
2023-03-14

我找到了一个解决方法。我可以将Spring HttpServletRequest注入到我的AuthorizationFilter中,并在其上设置SessionContext。

@Autowired
private HttpServletRequest request;

....

request.setAttribute("mySessionContext", sessionContext);

然后,因为spring知道HttpServletRequest,并且它基本上在我的SessionContextProvider中表示相同的东西,所以我做了同样的事情:

@Autowired
private HttpServletRequest request;

@Override
public SessionContext getSessionContext() {
    return (SessionContext) request.getAttribute("mySessionContext");
}

我不认为这是最好的解决方案。但它有效。如果有更好的解决方案,请等待任何其他输入。

问候乔纳斯

乜建柏
2023-03-14

问题是,通过Jersey/Spring集成,我们可以成功地将Springbean注入Jersey组件,但反过来也不总是如此。

Jersey有自己的DI框架HK21,它负责处理Jersey组件的注入。随着Jersey Spring的集成,Jersey将查找Spring Bean,并照原样接受它,它不会给它注入任何依赖项,我猜假设Spring应该负责它自己的注入。

话虽如此,如果您不要求ISession上下文提供程序是Spring豆,那么您可以将其设置为HK2服务。这很简单。如果您不需要任何特殊的初始化,则可以让HK2创建它。这里有一个简单的配置

public JerseyConfig extends ResourceConfig {
    public JerseyConfig() {
        register(new AbstractBinder() {
            bind(SessionContextProvider.class)
                    .to(ISessionContextProvider.class)
                    .in(RequestScoped.class);
        });
    }
}

仅此而已。您有一个可注入的< code > ISessionContextProvider < sup > 2 。

如果您要求ISessionContextProvider提供程序是一个Springbean,那么另一个选项是从SpringApplicationContext中获取bean,并使用HK2的 类似物,即它的ServiceLocatorFactory透明地完成所有工作,因此您仍然可以注入bean,而不需要在外部做任何额外的工作

import javax.inject.Inject;
import org.glassfish.hk2.api.Factory;
import org.glassfish.hk2.api.ServiceLocator;
import org.springframework.context.ApplicationContext;

public class SessionContextProviderFactory 
        implements Factory<SessionContextProvider> {

    private final ISessionContextProvider provider;

    @Inject
    public SessionContextProviderFactory(ApplicationContext ctx,
                                         ServiceLocator locator) {
        provider = ctx.getBean(ISessionContextProvider.class);
        locator.inject(provider);
    }

    @Override
    public ISessionContextProvider provide() {
        return provider;
    }

    @Override
    public void dispost(ISessionContextProvider provider) { /* noop */ }
}

那就注册工厂就行了

public JerseyConfig extends ResourceConfig {
    public JerseyConfig() {
        register(new AbstractBinder() {
            bindFactory(SessionContextProviderFactory.class)
                    .to(ISessionContextProvider.class)
                    .in(RequestScoped.class);
        });
    }
}

1-hk2
2-另请参阅Jersey 2.0的依赖注入

 类似资料:
  • 我有一个spring AOP方面类,它在每次调用服务时都会记录日志,我计划在日志中打印更多信息,这次每个请求都会有唯一的标识符,该标识符存储在请求范围的对象中,直到服务返回。我尝试将请求对象注入到@方面,但似乎效果不佳。 如果只有一个建议,它在我调用该服务时起作用,如果我添加更多建议,它会出错。(问题结束) 日志错误

  • 问题内容: 我试图将带注释的变量注入REQUEST范围: 其中,InjectingCallable将GetModule注入REQUEST范围内: GetModule的定义如下: 当我运行此代码时,出现以下错误: 如果我将相同的变量绑定到全局作用域,它将起作用。如果我删除了注释,它将起作用。此问题似乎特定于请求范围的带注释的变量。有任何想法吗? 问题答案: 问题是您没有此类型的绑定。仅仅因为您显式地

  • 我试图用jsf和CDI编写一个简单的登录表单。问题是当我注入我的SessionScoped bean时,它不像我期望的那样工作。这是我的豆子 这是我的控制器: 还有一个简单的Jsf表单,它调用login函数并显示LoginInfo类的计数器字段。 通过单击登录按钮和调试变量,我可以看到“lo”是这样的: lo={LoginInfo$Proxy$_$$_WeldClientProxy@16688}“

  • 本文解释了可以将RequestScoped Bean注入ApplicationScoped Bean中,并且客户机代理将在请求期间指向正确的实例:在CDI中,较短范围的Bean实例注入较大范围的Bean实例中-它是如何工作的? 当使用一个单独的生产者类进行额外处理并生成RequestScoped bean时,这是如何工作的?在部署到应用服务器时,由于不明确的依赖关系,我得到一个Deployment

  • 问题内容: 我正在尝试在Spring中建立一个请求范围的bean。 我已经成功设置好了,所以每个请求创建一次bean。现在,它需要访问HttpServletRequest对象。 由于该bean是每个请求创建一次的,所以我认为容器可以轻松地将请求对象注入到我的bean中。我怎样才能做到这一点 ? 问题答案: 可以将请求范围的Bean与请求对象自动连接。

  • 问题内容: 当尝试在OSGi中将RESTEasy与单例资源嵌入时(使用类似于的方式),令我惊讶的@Context UriInfo是,在每个请求中都注入了有效的字段。 进一步挖掘我发现代理魔术和在。很好,但是我在RESTEasy的文档和JAX-RS规范中都找不到任何有关此类行为的参考。 在Jersey文档中,我们可以找到以下内容: 特定请求对象存在例外,该请求对象甚至可以注入到具有单例作用域的资源的