JSF2: как привязать строковое значение к действию h: commandLink

Привет, мне нужно динамически установить действие h: commandLink как строковое значение со стороны компонента. Здесь объясняется моя проблема с кодом MenuObject.java


public class MenuObject {
    private String menuName;
    private String menuAction;
    public String getMenuName() {
        return menuName;
    }
    public void setMenuName(String menuName) {
        this.menuName = menuName;
    }
    public String getMenuAction() {
        return menuAction;
    }
    public void setMenuAction(String menuAction) {
        this.menuAction = menuAction;
    }



}


MenuCreator.java


public class MenuCreator {
    public List getMenu(){
        List menuList = new ArrayList();
        MenuObject menu1 = new MenuObject();
        menu1.setMenuAction("accountController.beginSearch()");
        menu1.setMenuName("Account");
        menuList.add(menu1);
        MenuObject menu2 = new MenuObject();
        menu2.setMenuAction("companyController.beginSearch()");
        menu2.setMenuName("Company");
        menuList.add(menu1);
        return menuList;
    }

main.xhtml


<ui:repeat value="#{menuCreator.menu}" var="subMenu">
    <li class="glyphicons cogwheels"><h:commandLink action="#{subMenu.menuAction}"><i></i><span><h:outputText value="#{subMenu.menuName}"/></span></h:commandLink></li>
    </ui:repeat>

Здесь мне нужно динамически изменять значение действия commandlink по отношению к значению строки bean (здесь это было menuAction). Но в этой ситуации я получил следующее исключение


javax.el.MethodNotFoundException: /WEB-INF/layouts/main.xhtml @137,85 action="#{menuCreator.menu}": Method not found: [email protected]()
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:109)
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87)
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:101)
    at net.bull.javamelody.JsfActionListener.processAction(JsfActionListener.java:65)


person Anish Antony    schedule 14.10.2013    source источник
comment
menuAction Я вижу здесь поле с геттером/сеттером. Вы не можете использовать это в атрибуте action   -  person kolossus    schedule 14.10.2013
comment
Посмотрите, что: stackoverflow.com/questions/12159777 /   -  person andremonteiro    schedule 14.10.2013


Ответы (2)


Вы пытаетесь использовать EL для возврата выражения значения, которое будет использоваться в качестве выражения метода в одиночном выражении. В учебнике JEE7 говорится:

9.3 Value and Method Expressions
The EL defines two kinds of expressions: value expressions and method expressions. 
Value expressions can either yield a value or set a value. Method expressions reference 
methods that can be invoked and can return a value.

Вы можете добиться такого поведения с помощью javascript или библиотеки, которая предлагает компонент динамического меню, например primefaces. .

person Yamada    schedule 14.10.2013

Возможно, вы можете попробовать что-то вроде Шаблон команды. Это только идея, я не проверял.

В xhtml:

<ui:repeat value="#{menuCreator.menu}" var="subMenu">
    <li class="glyphicons cogwheels">
        <h:commandLink action="#{invoker.callAction}" value="#{subMenu.menuName}">
             <f:setPropertyActionListener target="#{invoker.action}" value="#{subMenu.action}" />
        </h:commandLink>
    </li>
</ui:repeat>

Шаблон команды:

/* The Command interface */
public interface Command {
    String execute();
}

Пункт меню:

public class MenuObject {
    private String menuName;
    private Command action;
    // Getters and setters...
}

Вызывающий:

@Named("invoker")
public class Invoker {
    private Command action;

    public String callAction(){
        return action.execute();
    }
}
person Fernando González    schedule 14.10.2013