gpt4 book ai didi

java - Spring Jersey 在请求范围类上注入(inject) ContainerRequestContext

转载 作者:行者123 更新时间:2023-12-01 10:12:33 25 4
gpt4 key购买 nike

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

我想将一个对象从过滤器注入(inject)到 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();
}

如果我将 ContainerRequestContext 注入(inject)到我的 Web 资源中,一切都会按预期工作。但是,如果调用我的提供程序类 ContainerRequestContext 始终为 null。

我似乎不明白为什么这不起作用。

查看乔纳斯

最佳答案

问题是,通过 Jersey/Spring 集成,它允许我们成功地将 Spring bean 注入(inject) Jersey 组件,但反过来并不总是如此。

Jersey 有自己的 DI 框架 HK21,它负责处理 Jersey 组件的注入(inject)。通过 Jersey Spring 集成,Jersey 将查找 Spring Bean,并按原样使用它,它不会注入(inject)任何依赖项,我想假设 Spring 应该处理它自己的注入(inject)。

话虽如此,如果您不需要 ISessionContextProvider成为 Spring bean,那么您可以将其设为 HK2 服务。这很简单。如果您不需要任何特殊的初始化,您可以让 HK2 创建它。这里简单配置一下

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

就是这样。您有注入(inject)剂ISessionContextProvider 2

如果您需要ISessionContextProvider提供者成为 Spring bean,那么另一个选择是从 Spring 获取 bean ApplicatinContext ,并使用 HK2 的类似 ApplicationContext 自己显式注入(inject)它,其 ServiceLocator 。为此,我们需要使用 Factory透明地完成所有工作,因此您仍然可以注入(inject) 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 -
2 - 另请参阅 Dependency injection with Jersey 2.0

关于java - Spring Jersey 在请求范围类上注入(inject) ContainerRequestContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36062289/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com