【问题标题】:How to set a bean property of an injected CDI bean from the contains Bean?如何从包含 Bean 中设置注入的 CDI bean 的 bean 属性?
【发布时间】:2019-03-03 04:28:43
【问题描述】:

我有一个 CDI Bean,它被注入到另一个 CDI bean,

Bean1Controller:

@ViewScoped
public class bean1Controller
{
    @Inject
    Bean2Controller bean2;
    // + setter and getter

    // here I  initialise the injected Bean2
    @PostConstruct
    public void init()
    {
      bean2 = new Bean2Controller();
    }

 public void changeFlagBoolean()
 {
    bean2.setFlag(true);
 }

}

Bean2Controller:

 @ViewScoped
    public class bean2Controller
    {
       boolean flag=false;
       // + getters+setters
    }

XHTML 示例:

<h:commandLink style="font-size: 10px" 
               value="link"
               action="#{bean1Controller.changeFlagBoolean()}"
               target="content" />

当我单击它时,我的 XHTML 页面中有一个链接。我运行 bean1Controller 的方法 changeFlagBoolean() 将注入的 bean2Controller 的属性标志设置为 true。我就这样继续,但不幸的是它不起作用。

任何建议或某些东西都需要在代码中进行更改。 谢谢

【问题讨论】:

  • 嗨,如果 xhtml 不可见,我们如何提出建议? minimal reproducible example 请(和版本信息)
  • 已编辑!!谢谢
  • 谢谢。版本信息仍然缺失,这不是真正的minimal reproducible example,但很接近。而“不起作用”并不是很有帮助的分析。更多的是最终用户描述,而不是开发人员描述。去掉target属性还能用吗?

标签: jsf cdi managed-bean


【解决方案1】:

更新了 Answear,

经过这样的研究,我得到了解决方案,

问题出在@viewScoped 范围内,我无法更改注入 bean 中 flag 属性的值,并且在执行bean2.setFlag(true); 后它仍然始终为 false 如果我从 view1.xhtml 转到 view2.xhtml 会出现问题,我有一个 bean1Controller 的新实例,这就是为什么我总是将 false 作为值,因为它是基于视图范围的。

解决方案是使用 Flash https://memorynotfound.com/passing-variables-in-jsf-flash-scope/ 。我将值保存在闪存中并将其值设置为“true”,然后在 bean2Controller 中调用它,以便它在 bean1Controller 中可用,并通过调用 flag = (boolean)flash.get("flag");

【讨论】:

  • 在您的代码中 - bean2 = new Bean2Controller(); - 表示 Bean2Controller 不是 CDI bean。如果你想让它成为 CDI,你需要让 CDi 容器处理创建(例如,避免使用 new 并让 @Inject 编织它的魔力)。
猜你喜欢
  • 2013-02-22
  • 2019-08-04
  • 1970-01-01
  • 1970-01-01
  • 2015-04-15
  • 2015-02-12
  • 2015-04-11
  • 2014-06-02
  • 1970-01-01
相关资源
最近更新 更多