用于从各种 bean 调用一个方法的复合组件

Composit component used to call one method from various beans

我需要从多个 bean 中动态调用同名方法,我尝试了以下复合代码,如果不带参数传递它可以正常工作,但如果传递参数则代码不起作用。

        <ui:composition> 
            <ui:param name="bean" value="#{managedBean}" />
            <ui:param name="method" value="MoveMainListPointer" />
            <o:methodParam name="methodfinal" value="#{bean[method]}" />
            <p:commandButton action="#{methodfinal}" value="Submit" />
            <br/>
        </ui:composition>

后续调用成功

<pc:PinnacleToolBar managedBean="#{BeanName1}" />
<pc:PinnacleToolBar managedBean="#{BeanName2}" />
<pc:PinnacleToolBar managedBean="#{BeanName3}" />

但作为参数传递,

        <ui:composition> 
            <ui:param name="bean" value="#{managedBean}" />
            <ui:param name="method" value="MoveMainListPointer('First')" />
            <o:methodParam name="methodfinal" value="#{bean[method]}" />
            <p:commandButton action="#{methodfinal}" value="Submit" />
            <br/>
        </ui:composition>
    public void MoveMainListPointer (MoveOptions M) {
        gu.MovePointer( this, M, listHeader, detTable, detTableHeaderNames, mainArray, detailArray );
    }

错误

method not found

发生。

请推荐。

在 EL (Expression Language) 中,您正在调用这样的方法:

someBean.MoveMainListPointer('First')

bean 中的方法如下所示:

public void MoveMainListPointer (MoveOptions M) {...}

现在来看EL中传递的参数:'First'。单引号中的文本是一个字符串。您在 EL 中使用 String 作为参数调用该方法,实际上您想要在 bean 中使用一些 MoveOptions 来调用该方法。您应该注意到它们是不一样的(字符串是 而不是 MoveOptions)。 EL搜索以String为参数的方法,不存在所以找不到方法

解决方案

如果您想使用字符串设置参数,请将 bean 中的方法更改为以下内容:

public void MoveMainListPointer(String strg) {
    // instantiate the MoveOptions here based on the string value
}

(注意:由于用户没有输入MoveOptions的代码,我无法提供如何做到这一点。)

此外,方法的约定是第一个字母小写 (see google conventions)。

根据@fuggerjaki61贴出的解决方案,最终代码如下:-

    public static enum MoveOptions {
        Save,
        Edit,
        Clear,
        Delete,
        Check,
        Approve,
        First,
        Previous,
        Next,
        Last,
        Goto,
        Print,
        Copy,
        AdvanceSearch,
        Knocking
    }
    public void moveMainListPointer (String wToDo) {
        MoveOptions M = MoveOptions.valueOf(wToDo);
        System.out.println("Option: " + M);
        gu.MovePointer( this, M, listHeader, detTable, detTableHeaderNames, mainArray, detailArray );
    }

控制

            <ui:param name="bean" value="#{managedBean}" />

            <o:methodParam name="MFS" value="#{bean.moveMainListPointer('Save')}" />
            <ui:param name="MFSB" value="#{bean.lockSaveButton}" />
            <p:commandButton id="btnSave" action="#{MFS}" value="Save" disabled="#{MFSB}"/>

            <o:methodParam name="MFS" value="#{bean.moveMainListPointer('Edit')}" />
            <p:commandButton id="btnEdit" action="#{MFS}" value="Edit" />

最后是电话

<pc:PinnacleToolBar managedBean="#{BeanName}" />