【问题标题】:What to expect of Inject in comparison to ManagedProperty与 ManagedProperty 相比,Inject 的期望是什么
【发布时间】:2013-09-11 07:57:41
【问题描述】:

我开始使用Inject 而不是ManagedProperty。我已经进行了一些测试,在其中一个测试中,我将一个 ViewScoped bean (Bean1) 注入到另一个具有相同范围的 (Bean2) 中:

@Inject
private Bean1 bean1;

Bean1 有一个变量item 代表一个艺术家,而艺术家有许多不同的字段,例如:名称、专辑列表等。

在 Bean2 中我需要访问 Bean1 中的项目:

Artist artist = bean1.getItem();

当我在该行设置断点以查看 Bean1 中的内容时,我可以看到变量 item,但是当我展开 item 时,没有设置任何字段。

如果我尝试使用调试器进入 getItem() 方法,我会收到以下消息:

Thread http-listener-1(2) stopped at beans.Bean1$Proxy$_$$_WeldClientProxy.getItem - compiled without debug info.

使用调试器降低一行,然后查看artist 变量,所有字段都已设置为正确的值。这个怎么可能?之前一切都是空的。

Edit1:如果我将Inject 替换为ManagedProperty,从javax.faces.view.ViewScoped 更改为javax.faces.bean.ViewScoped 并执行相同的调试步骤,我可以看到@ 中的字段987654339@ 已设置。我也可以步入方法getItem()

【问题讨论】:

  • 这里的实际问题是什么?你的 bean 没有被注入?
  • 它似乎被注入了,但后来我得到空指针异常。我的具体问题是为什么我看不到 item 中的字段,为什么我不能进入方法 getItem() 以及为什么 artist 最终还是被设置了。

标签: jsf dependency-injection cdi jsf-2.2


【解决方案1】:

如果您从@ManagedProperty 切换到@Inject,您可能还会忘记javax.faces.bean.* 包中的所有注释。原因是不能将JSF自带的依赖注入机制和CDI混在一起,否则会导致意外的行为。

【讨论】:

  • 这并不完全准确。对于 JSF2.2,@ManagedBean 现在是 @Inject 的有效目标。
  • 看来你可能是对的。然而,2.2 JSF 通过新的ViewScopedFlowScoped 注释引入了对CDI 的依赖,尽管是可选的,所以我认为这是JSF 向CDI 发展的标志。此外,javax.faces.bean.ViewScoped 在 JSF 2.2 中收到了弃用警告。
  • 你说得对,JSF 注释最终将被 CDI 注释取代
猜你喜欢
  • 2017-09-14
  • 2013-11-26
  • 1970-01-01
  • 2021-10-14
  • 1970-01-01
  • 2016-06-08
  • 1970-01-01
  • 2016-07-03
  • 1970-01-01
相关资源
最近更新 更多