如何从包含Bean设置注入的CDI Bean的Bean属性?

时间:2018-09-27 09:37:04

标签: jsf cdi managed-bean

我有一个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 。我那样做,但不幸的是,它不起作用。

任何建议或代码中需要更改的内容。 谢谢

1 个答案:

答案 0 :(得分:0)

更新的Answear,

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

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

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

来获取它。