如何将请求级别对象嵌入@Context

时间:2017-09-22 14:02:55

标签: java jersey jax-rs

在嵌入式Jersey中,我可以注册一个Binder来放入一些我最终可以使用@Context

访问的资源

但是,我放入的内容更全局,而不是按请求级别。我知道我可以使用一些属性映射来完成它,但我宁愿通过类@Context

之类的Response foo(@Context HttpServletRequest)来完成它

我尝试了setRequestScopedInitializer()但它没有按预期放入它们并且跟随Ref的示例给我一个空指针异常

有没有办法做到这一点?

1 个答案:

答案 0 :(得分:1)

这是我最终如何做到的,但我不喜欢我使用了命名属性

RoutingContext是我想要注入的类型

public class RoutingContextFactory implements
Supplier<RoutingContext> {

@Inject
private ContainerRequest request;

@Override
public RoutingContext get() {

    return (RoutingContext) request.getProperty(RoutingContext.class.getName());
}
}

我的活页夹

public class MyBinder extends AbstractBinder {

@Override
protected void configure() {

    bindFactory(RoutingContextFactory.class)
        .to(RoutingContext.class)
        .proxy(true)
        .proxyForSameScope(false)
        .in(RequestScoped.class);

}

}

初始化
    final ResourceConfig resourceConfig = ResourceConfig.forApplicationClass(applicationClass);
    resourceConfig.register(new MyBinder());

加载
    final ContainerRequest request = new ContainerRequest(...
    request.setProperty(RoutingContext.class.getName(), routingContext);

使用
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello(
    @Context final RoutingContext routingContext) {

    return "Hello" 
        + routingContext;

}

我仍然希望有一种方法让我去request.register(routingContext)。我为此打开了https://github.com/jersey/jersey/issues/3682