我正在使用主要使用JAX-RS(Jersey)和CDI(Weld)的Java EE RESTful堆栈,这两者都是由我的Payara(Glassfish)服务器提供的。
我想分享有关我的图层之间的飞行请求的上下文信息,例如,我们只讨论loggedUser
。所以我创建了这个类以保持状态:
public class RequestContext {
private User loggedUser;
public void setLoggedUser(User user) { this.loggedUser = user; }
public User getLoggedUser() { return this.loggedUser }
}
还有一个制片人:
public class RequestContextProducer {
@Produces
@RequestScoped
public RequestContext produce() {
return new RequestContext();
}
}
请求被JAX-RS RequestFilter拦截:
@Provider
@Priority(1)
public class AuthenticationRequestFilter implements ContainerRequestFilter {
@Inject
RequestContext context;
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
...
context.setLoggedUser(new User());
... // context.getLoggedUser() return null here, even just after being setted.
}
}
正如您在源代码中看到的那样,我的问题是setter方法实际上从未设置任何内容。
我曾经在使用JBOSS时使用相同的策略,这总是按预期工作,所以我很困惑。
我刚刚发现将生产者范围更改为@Dependent
会使字段得到设置,但是,当在下面的图层上再次注入RequestContext
时,它会解析为新的实例,为null在每个字段中,包括loggedUser
。
有什么想法吗?