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

标签 java jersey jax-rs

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

但是,我放入的这些内容更加全局化,而不是在每个请求级别上。我确实知道我可以通过一些属性映射来做到这一点,但我宁愿通过 @Context 和类似 Response foo(@Context HttpServletRequest)

的类来做到这一点

我尝试了 setRequestScopedInitializer() 但它没有按预期将它们放入,并且按照他们的示例使用 Ref 给了我一个空指针异常

有什么办法可以做到这一点吗?

最佳答案

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

RoutingContext 是我想要注入(inject)的类型

public class RoutingContextFactory implements
Supplier<RoutingContext> {

@Inject
private ContainerRequest request;

@Override
public RoutingContext get() {

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

我的 Binder

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为此。

关于java - 如何将请求级别对象嵌入到@Context,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46366643/

相关文章:

java - 正确使用 "Hashtable"的方法?

java - 如何按顺序延迟更改按钮颜色

java - 何时使用 Jersey 的 @Singleton 注释?

java - 带有 CDI Weld 4 而非 HK2 的 Jersey 3

java - @QueryParam 如何将没有值的参数转换为 boolean 值 "false"?

Java 14记录json序列化

java - GCJ 和 Java 主页

Java:Jersey Rest 服务 URL 映射问题

java - Jersey 没有看到我的 MessageBodyReader

java - Resteasy 3 及更高版本中 ClientResponse 的替代方案是什么?