Композитный компонент, используемый для вызова одного метода из различных компонентов - PullRequest
1 голос
/ 08 февраля 2020

Мне нужно динамически вызывать метод с одним и тем же именем из нескольких 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

.

Просьба предложить.

Ответы [ 2 ]

1 голос
/ 11 февраля 2020

Согласно решению, опубликованному @ 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}" />
0 голосов
/ 11 февраля 2020

В EL ( E xpression L anguage) вы вызываете метод следующим образом:

someBean.MoveMainListPointer('First')

Метод в компоненте выглядит следующим образом:

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

Теперь давайте посмотрим на параметр, переданный в EL: 'First'. Текст в одинарных кавычках является строкой. Вы вызываете метод со String в качестве параметра в EL, и на самом деле вы хотите вызвать метод с некоторым MoveOptions в бине. Вы должны заметить, что они не одинаковы (строка не MoveOptions). EL ищет метод с String в качестве параметра, который не существует, поэтому метод не может быть найден.

Решение

Поскольку вы хотите установить параметр с помощью Строка меняет метод в bean-компоненте следующим образом:

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

(Примечание: поскольку пользователь не поставил код MoveOptions, я не могу предоставить, как это сделать.)

Кроме того, соглашение о методах заключается в том, что первый регистр состоит из строчных букв ( см. Соглашения Google ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...