如何将值从一个bean传输到另一个bean? (@ManagedProperty帮助)

时间:2014-08-02 00:57:38

标签: jsf-2 primefaces

我正在使用PrimeFace4.0,JSF 2.2,Java和XHTML。我有一个字符串值,我需要从一个bean传递到另一个bean。在一个XHTML页面上选择该值,当用户单击以选择时,将启动新的网页。我可以从我的服务器输出中看到第一个bean(TestSelectBean)成功收集的值,但我似乎无法将它放入下一个bean(TargetBeanFranz)。当String被硬编码到bean中时,它可以正常工作。但是,当我尝试使用托管属性根据用户输入调用它时,我在代码行(85)处得到一个NullPointer,我正在尝试使用它。

第一个HTML: testselect.xhtml

//irrelevant code
<p:layoutUnit position="center">
                    <h:form>
                        <p:selectOneRadio id="Test"  value="#{testSelectBean.selectedNameOfExperiments}" >
                            <f:selectItems id="selectedNameOfExperiments" value="#{testSelectBean.nameofexperiments}" var="entry" itemValue="#{entry.key}" itemLabel="#{entry.value}" />
                        </p:selectOneRadio>

                        <p:commandLink id="nonAjax"  action="open" actionListener="#{testSelectBean.getParameters}" style="margin-right:20px;" ajax="false">
                            <h:outputText value="Submit" />
                        </p:commandLink>

                    </h:form>
                </p:layoutUnit>

选择selectedNameOfExperiments的用户被简单地传递给 TestSelectBean

@ManagedBean(name = "testSelectBean", eager = true)
@SessionScoped

public class TestSelectBean implements Serializable {

    private static final long serialVersionUID = 1L;
    protected String selectedNameOfExperiments;
    private final Map<String, String> nameofexperiments;
    private transient String selected;

    public TestSelectBean() throws SQLException {

        selected = new String();

        nameofexperiments = new HashMap<String, String>();
        XYexpdataServiceAdapter xydata = new XYexpdataServiceAdapterImpl();
        List<String> dbnameofexperiments = xydata.getNameofexperiments();
        for (String ta : dbnameofexperiments) {
            nameofexperiments.put(ta, ta);
        }
    }

    public String getSelectedNameOfExperiments() {
        return selectedNameOfExperiments;
    }

    public void setSelectedNameOfExperiments(String selectedNameOfExperiments1) {
        this.selectedNameOfExperiments = selectedNameOfExperiments1;
    }

    public Map<String, String> getNameofexperiments() {
        return nameofexperiments;
    }

    public void getParameters() {
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("You've selected Experiment:" + selectedNameOfExperiments));
        System.out.println("You've selected Experiment:" + selectedNameOfExperiments);
    }
}

但是,除非Experiment被硬编码到TargetBeanFranz中,否则XHTML FranzwPopup 将无法启动。

//irrelevant code
<p:layoutUnit position="center">

                    <p:panelGrid columns="2" style=" font-size: 14">
                        <h:outputLabel  value="Description" style="font-size: 20"/>
                        <h:outputText value="Neutron-induced production of protons, deuterons and tritons in Copper and Bismuth."/>

                        <h:outputLabel value="Reference" style="font-size: 20"/>
                        <h:outputText value="Nuclear Physics A510 (1990) 774-802 (Franz, et. al.)"/>
                    </p:panelGrid>

                    <form action="http://localhost:8080/primefaces/faces/handle.xhtml" method="get" name="login" onsubmit="process();
                            return false;" style="overflow-y: scroll">
                        Click to display chart data in a table.<br />
                        <input type="submit" value="Display"/>
                    </form>

                    <h:form>

                        <h:panelGrid columns="4" cellpadding="5">
                            <p:selectCheckboxMenu id="menu1" value="#{targetBeantFranz.selectedTargets}" label="Targets" filter="true" filterMatchMode="startsWith"
                                                  panelStyle="width:220px">
                                <f:selectItems value="#{targetBeantFranz.targets}" />
                            </p:selectCheckboxMenu>
                            <p:selectCheckboxMenu id="menu2" value="#{targetBeantFranz.selectedSecondaries}" label="Secondaries" filter="true" filterMatchMode="startsWith"
                                                  panelStyle="width:220px">
                                <f:selectItems value="#{targetBeantFranz.secondaries}" />
                            </p:selectCheckboxMenu>
                            <p:selectCheckboxMenu id="menu3" value="#{targetBeantFranz.selectedReactions}" label="Reactions" filter="true" filterMatchMode="startsWith"
                                                  panelStyle="width:220px">
                                <f:selectItems value="#{targetBeantFranz.reactions}" />
                            </p:selectCheckboxMenu>
                            <p:selectCheckboxMenu id="menu4" value="#{targetBeantFranz.selectedBeamEnergies}" label="Beam Energy" filter="true" filterMatchMode="startsWith"
                                                  panelStyle="width:220px">
                                <f:selectItems value="#{targetBeantFranz.beamenergies}" />
                            </p:selectCheckboxMenu>

                        </h:panelGrid>

                        <p:panel header="Resulting Plots"> 



                            <p:commandLink id="nonAjax" actionListener="#{targetBeantFranz.getParameters}" style="margin-right:20px;" ajax="false">
                                <button id="change">Submit Query</button>
                            </p:commandLink>

                            <div id="container" style="min-width: 310px; margin: 0 auto"></div>
                        </p:panel>
                    </h:form>

                </p:layoutUnit>
//more irrelevant 

相反,我在 TargetBeanFranz 的第85行获得了一个NPE,我尝试初始化Experiment

//stuff
@ManagedBean(name = "targetBeantFranz", eager = true)
@SessionScoped

public class TargetBeanFranz implements Serializable {

    @ManagedProperty(value="#{testSelectBean}")
    private TestSelectBean testSelectBean;

    public TestSelectBean getTestSelectBean(){
        return testSelectBean;
    }

    public void setTestSelectBean (TestSelectBean testSelectBean) {
        this.testSelectBean = testSelectBean;
    }



    private static final long serialVersionUID = 1L;
    private String Experiment;
//more stuff
public TargetBeanFranz() throws SQLException {

        targets = new HashMap<String, String>();
        selectedTargets = new ArrayList<String>();
        secondaries = new HashMap<String, String>();
        selectedSecondaries = new ArrayList<String>();
        reactions = new HashMap<String, String>();
        selectedReactions = new ArrayList<String>();
        beamenergies = new HashMap<String, String>();
        selectedBeamEnergies = new ArrayList<String>();
        seriesDataArray = new ArrayList<String>();
        seriesDataArArray = new ArrayList<ArrayList<String>>();
        seriesNameArray = new ArrayList<String>();
        seriesToolTipArray = new ArrayList<String>();
        seriesErrorArray = new ArrayList<String>();
        seriesErrorArArray = new ArrayList<ArrayList<String>>();
        allselected = new ArrayList<XYexpdata>();
        Experiment = testSelectBean.getSelectedNameOfExperiments(); //This is line 85 and where I'm getting the NPE.


        XYexpdataServiceAdapter xydata = new XYexpdataServiceAdapterImpl();
        List<String> dbtargets = xydata.getTargetNamesbyExperiment(Experiment);
        for (String ta : dbtargets) {
            targets.put(ta, ta);
        }
        List<String> dbsecondaries = xydata.getSecondaryNamesbyExperiment(Experiment);
        for (String ta : dbsecondaries) {
            secondaries.put(ta, ta);

        }
        List<String> dbreactions = xydata.getReactionNamesbyExperiment(Experiment);
        for (String ta : dbreactions) {
            reactions.put(ta, ta);
        }
        List<String> dbbeamenergies = xydata.getBeamEnergybyExperiment(Experiment);
        for (String ta : dbbeamenergies) {
            beamenergies.put(ta, ta);
        }

    }
//more code

1 个答案:

答案 0 :(得分:0)

我认为您的问题的原因是,您的命令链接中的动作侦听器的签名不匹配。

bean中的方法必须是以下类型:

public void getParameters(javax.faces.ActionEvent event) {
   .....
}

如果您使用的是Java EE 7,则还应避免使用javax.faces.bean包中的注释,因为它们已被放弃。使用CDI bean,它可以让生活更轻松:

@Named
@SessionScoped
public class TestSelectBean {
 ...
}

@Named
@SessionScoped  
public class TargetBeanFranz {

    @Inject
    private TestSelectBean testSelectBean;

    ....
}

在此处查看有关CDI主题的更多信息:Backing beans (@ManagedBean) or CDI Beans (@Named)?