gpt4 book ai didi

java - 子资源和 CDI 注入(inject)问题

转载 作者:行者123 更新时间:2023-11-29 04:34:06 24 4
gpt4 key购买 nike

我是 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 注入(inject)与 ResoureContext 一起使用?

最佳答案

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

首先,您的样本无效。或者更准确地说,这个位:

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

您正在通过 new 关键字创建 SubResource 实例您自己。因此 CDI 对其存在一无所知,对此类对象的控制绝对为零。因此,CDI 无法向该对象注入(inject)任何内容。

现在是工作示例:

@Context
private ResourceContext context;

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

在这种情况下,您注入(inject)了一个上下文(已经是一个 CDI 管理的“对象”)并告诉它为您检索资源。因此,您让 CDI 容器处理对象创建及其生命周期。由于它管理创建,它还可以解析注入(inject)点并注入(inject) MyBean

通常,当您想使用 CDI 时,您几乎不会通过 new 创建对象。明显的异常(exception)是生产者,但我们在这里不讨论这些。

关于java - 子资源和 CDI 注入(inject)问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42504072/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com