当前位置: 首页 > 知识库问答 >
问题:

如何将对象注入jersey请求上下文?

彭英逸
2023-03-14

过滤器类

@Override
public void filter(ContainerRequestContext request) throws IOException {
    MyObject obj = new MyObject();
    // Inject MyObject to request which I dont know how
}

资源类别

@PUT @Consumes("application/json")
@Path("/")
public String create(
        JSONParam sample,
        @Context MyObject obj) {

    System.out.println(obj.getName());

    return "";
}

共有1个答案

文国发
2023-03-14

您可以使用ContaInterRequestContext.SetProperty(String,Object)。然后只需插入ContainerRequestContext

@Override
public void filter(ContainerRequestContext crc) throws IOException {
    MyObject obj = new MyObject();
    crc.setProperty("myObject", myObject);
}

@POST
public Response getResponse(@Context ContainerRequestContext crc) {
    return Response.ok(crc.getProperty("myObject")).build();
}

直接插入MyObject的另一个选择是使用Jersey 2提供的HK2功能。

创建一个工厂,注入ContainerRequestContext并返回MyObject。例如

import javax.inject.Inject;
import javax.ws.rs.container.ContainerRequestContext;
import jetty.plugin.test.domain.MyObject;
import org.glassfish.hk2.api.Factory;

public class MyObjectFactory implements Factory<MyObject> {
    
    private final ContainerRequestContext context;
    
    @Inject
    public MyObjectFactory(ContainerRequestContext context) {
        this.context = context;
    }

    @Override
    public MyObject provide() {
        return (MyObject)context.getProperty("myObject");
    }

    @Override
    public void dispose(MyObject t) {}  
}
public class InjectApplication extends ResourceConfig {
    
    public InjectApplication() {
        ...
        register(new AbstractBinder(){
            @Override
            protected void configure() {
                bindFactory(MyObjectFactory.class)
                        .to(MyObject.class)
                        .in(RequestScoped.class);
            } 
        });
    }
}

使用与上面筛选器示例中相同的属性设置,然后可以将MyObject插入到@context

@GET
public Response getTest(@Context MyObject myObject) {
    return Response.ok(myObject.getMessage()).build();
}
  • 自定义注入
  • 查看更多信息

有关此实现的问题,请参见此问题。

    null
 类似资料:
  • 问题内容: 我有灰熊提供的球衣。 我有一个实现类。但是,为所有传入请求创建一次此类。因此,这样做: 该为空。我可以将上下文注入到被调用的实际端点中,但这相当粗陋和丑陋,对我来说真的没有用;因为我希望记录各种请求。理想情况下,希望在请求的ResponseFilter端获取此对象。 必须有一种简单的方法来执行此操作。到目前为止,我所看到的所有问题/答案都不适用于Grizzly,也无法插入REST端点调

  • 我已经看了很多帖子,似乎没有什么能像我喜欢的那样工作。 我想将一个对象从一个过滤器注入到ContainerRequestContext属性中,然后在其他类中检索它。 这是我的过滤器: 下面是我想要访问ContainerRequestContext的类: 我的spring配置: 如果我将容器请求上下文注入到我的 Web 资源中,一切都按预期工作。但是,如果调用我的提供程序类容器请求上下文始终为空。

  • 我有一个spring AOP方面类,它在每次调用服务时都会记录日志,我计划在日志中打印更多信息,这次每个请求都会有唯一的标识符,该标识符存储在请求范围的对象中,直到服务返回。我尝试将请求对象注入到@方面,但似乎效果不佳。 如果只有一个建议,它在我调用该服务时起作用,如果我添加更多建议,它会出错。(问题结束) 日志错误

  • 我试图实现一个< code > ContainerRequestFilter 来检查一些东西。最终,它将从SSL客户机证书中提取通用名称,但我还没有做到这一点。过滤器运行在Grizzly HTTP服务器上(Grizzly 2.3.8,没有servlet容器),位于JAX-RS资源(Jersey 2.6)的前面。 当我尝试将注入过滤器时,它为null。 将请求注入到 JAX-RS 资源中,注入是成功

  • 在Jersey 2中,我可以将一个定制的、请求特定的值注入到我的资源中吗?具体来说,我想注入一个< code>MyThing,它可以从我的自定义安全上下文< code>MySecurityContext中派生出来。我想直接注入< code>MyThing来使代码变得干净。 有什么办法可以做到这一点吗?根据这个问题,它不能使用尽管本文和此示例表明它可能是可能的。 使用身份验证筛选器,我可以使用以下代

  • 我想在日志文件中记录服务器的请求/响应。我正在使用Springboot球衣2. x log4j2。我像这样注册了泽西的日志功能- log4j2。xml 在模式中,我在log4j2的的帮助下注入事务id。我的pom中有。xml,我正在使用它运行它 。 一切正常,唯一的问题是,在jersey的日志中,我无法插入事务id。我使用自定义代码尝试了utils日志,并且我能够将事务id放入其中。但当jerse