我已经看了很多帖子,似乎没有什么能像我喜欢的那样工作。
我想将一个对象从一个过滤器注入到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 资源中,一切都按预期工作。但是,如果调用我的提供程序类容器请求上下文始终为空。
我似乎不知道为什么这不会奏效。
里格兹·乔纳斯
我找到了一个解决方法。我可以将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");
}
我不认为这是最好的解决方案。但它有效。如果有更好的解决方案,请等待任何其他输入。
问候乔纳斯
问题是,通过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文档中,我们可以找到以下内容: 特定请求对象存在例外,该请求对象甚至可以注入到具有单例作用域的资源的