Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 子资源和CDI注入问题_Java_Rest_Jakarta Ee_Jax Rs_Cdi - Fatal编程技术网

Java 子资源和CDI注入问题

Java 子资源和CDI注入问题,java,rest,jakarta-ee,jax-rs,cdi,Java,Rest,Jakarta Ee,Jax Rs,Cdi,我对jax-rs还不熟悉,而且我一直在使用子资源。看一看 这不起作用 @Path(..) public class Test { @Path(...) public SubResource getSub(){ return new SubResource(); } } public class SubResource { @Inject private MyBean myBean; @GET public String getStr(){ return myBean.g

我对jax-rs还不熟悉,而且我一直在使用子资源。看一看

这不起作用

@Path(..)
public class Test
{
 @Path(...)
 public SubResource getSub(){
  return new SubResource();
 }
}

public class SubResource {
 @Inject
 private MyBean myBean;

 @GET
 public String getStr(){
  return myBean.getStr(); // myBean is null, injection didnt work properly
}
这是可行的,但为什么

@Path(..)
public class Test
{
 @Context
 private ResourceContext context;

 @Path(...)
 public SubResource getSub(){
  return context.getResource(SubResource.class);
 }
}

public class SubResource{
 @Inject
 private MyBean myBean;

 @GET
 public String getStr(){
  return myBean.getStr(); // myBean is not null anymore, why?
}

为什么CDI注入与文本一起工作

这与子资源或JAX-RS无关。原则上,这是关于CDI注入如何工作的

首先,你的样品不起作用。或者准确地说,这一点:

@Path(...)
 public SubResource getSub(){
  return new SubResource();
 }
您正在通过
new
关键字创建
SubResource
实例yourself。因此CDI不知道它的存在,对这样的对象绝对没有控制权。因此,CDI不能向该对象注入任何内容

现在来看工作示例:

@Context
 private ResourceContext context;

 @Path(...)
 public SubResource getSub(){
  return context.getResource(SubResource.class);
 }
在本例中,您注入了一个上下文(已经是一个CDI管理的“对象”),并告诉它为您检索资源。因此,您可以让CDI容器处理对象创建及其生命周期。由于它管理创建,它还可以解析注入点并注入
MyBean


通常,当您想要使用CDI时,您几乎从不通过
new
创建对象。明显的例外是生产者,但我们这里不讨论生产者。

每当您创建这样的对象时:

return new SubResource();
那么它的生命周期属于您,并且不会对其执行任何注入

在第二种情况下,您已经允许JAX-RS容器创建
子资源

return context.getResource(SubResource.class);

这使它能够控制对象生命周期,使它有机会执行注入和其他生命周期操作,例如执行
@PostConstruct
带注释的方法。

非常感谢。使用子资源和cdi注入时的最佳实践是什么?是资源背景吗?这是一个非常模糊的问题。不管什么对你有用,真的。正如旁注-
resourcecontext
不是CDI本身的一个类,它是与CDI集成的包it
javax.ws.rs.container
。另外,请看,它是这样写的:
资源上下文提供对资源类实例的访问。
(以及更多…)因此,是的,这完全是一种有效且完全有意的方式!非常感谢。使用子资源和cdi注入时的最佳实践是什么?是resourceContext吗?最佳实践是使用最简单的有效解决方案。