Java JaxRS+;RestEasy-如何创建自己的@Context注入字段?

Java JaxRS+;RestEasy-如何创建自己的@Context注入字段?,java,jboss,jax-rs,resteasy,Java,Jboss,Jax Rs,Resteasy,关于JBoss7.1.0上RestEASY 3.6.2的问题 我有以下工作的JaxRS服务: @Path("my-service") public class MyResource { @Context HttpServletRequest request; @GET @Path("get-stuff") @Produces(MediaType.APPLICATION_JSON) public Response doStuff() { MyCustomConte

关于JBoss7.1.0上RestEASY 3.6.2的问题

我有以下工作的JaxRS服务:

@Path("my-service")
public class MyResource {
  @Context
  HttpServletRequest request;

  @GET
  @Path("get-stuff")
  @Produces(MediaType.APPLICATION_JSON)
  public Response doStuff() {
    MyCustomContext customContext = new MyCustomContext(request);
    // ... use the customContext here.
  }
}
按照当前的设置方式,每个rest方法都需要一个
MyCustomContext=newmycustomcontext(请求)。那真烦人

是否有办法注入
MyCustomContext

@Path("my-service")
public class MyResource {
  @Context
  MyCustomContext context;

  @GET
  @Path("get-stuff")
  @Produces(MediaType.APPLICATION_JSON)
  public Response doStuff() {
    // ... use the customContext here.
  }
}

@Producer // ???
public class MyCustomContext {
  @Context
  HttpServletRequest request;

  public MyCustomContext() {
    // construct with request object.
  }
}

我已经找到了大量的链接,这些链接暗示了一种实现这一点的方法,但我的答案是空的

我不知道用什么方法注入自定义类实例/bean。我想概述取决于具体要求的备选办法

A)根本不需要注射。

使自定义上下文成为JAX-RS资源类的类成员(而不是每个方法中的局部变量)。一旦容器创建了已初始化的资源类实例,就可以利用来实例化自定义上下文。资源类必须是具有请求作用域的CDIBean,才能工作

@Path(“我的服务”)
@RequestScope//CDIBean,仅具有请求范围
公共类MyResource{
@上下文
私有HttpServletRequest;
私有MyCustomContext;
@施工后
公共无效初始化(){
this.customContext=new MyCustomContext(this.request);//此时已由容器初始化请求
}
@得到
@路径(“获取内容”)
@产生(MediaType.APPLICATION_JSON)
公众回应{
//…在此处使用customContext。
}
}
B)您的自定义上下文只需要一个实例

除了JAX-RS via@Context之外,对于HttpServletRequest via。您还可以将自定义上下文设置为CDIBean,并注入预定义的CDIBean。之后,您可以将自定义上下文注入到JAX-RS资源中(不管它是EJB还是CDIBean)

@Dependent//使您的自定义上下文成为CDIBean
公共类MyCustomContext{
@Inject//Inject预定义的CDIBean
私有HttpServletRequest;
}
@Path(“我的服务”)
@requestscope//cdibean
//@无状态//或EJB
公共类MyResource{
@Inject//通过CDI注入自定义上下文
私有MyCustomContext;
@得到
@路径(“获取内容”)
@产生(MediaType.APPLICATION_JSON)
公众回应{
//…在此处使用customContext。
}
}
C)您的自定义上下文需要通过提供一个独占的实例,例如

如果通过@Context将实例注入非JAX-RS自定义上下文CDIBean,则该实例将为null。您需要一些机制来从JAX-RS资源提供注入的实例。让CDI负责通过自定义上下文上的@Inject进行注入,并通过向JAX-RS资源中添加生产者方法将完成这项工作

@Dependent//使您的自定义上下文成为CDIBean
公共类MyCustomContext{
//@Context//在非JAX-RS上下文中,实例将为null
@Inject//而是通过CDI注入JAX-RS上下文实例
私人请求;
}
@Path(“我的服务”)
@requestscope//cdibean
//@无状态//或EJB
公共类MyResource{
@Context//在JAX-RS上下文中,实例将不为null
私人请求;
@注入
私有MyCustomContext;
@生成//提供JAX-RS上下文实例,以便通过CDI进行注入
@请求范围
公共请求getContextRequest(){
返回此请求;
}
@得到
@路径(“获取内容”)
@产生(MediaType.APPLICATION_JSON)
公众回应{
//…在此处使用customContext。
}
}

请在您的问题中添加至少前5个“大量链接”。