Как оценить MethodExpressions в составных компонентах JSF - PullRequest
4 голосов
/ 16 декабря 2011

Я не уверен в "правильном" способе работы с выражениями методов в составных компонентах.

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

При использовании страницы:

<my:component action="#{myBean.actionMethod}" />

Составной:

<cc:interface componentType="mycomponentType">
  <cc:attribute name="action" method-signature="java.lang.String action()" required="false" />
</cc:interface>

<cc:implementation>
  <h:commandButton value="submit" action="#{cc.componentAction}" />
</cc:implementation>

Класс поддержки:

@FacesComponent("mycomponentType")
public class UIMyComponent extends UINamingContainer {   

public String action() {
    String outcome = "";

    ValueExpression ve = getValueExpression("action");
    String expression = ve.getExpressionString();

    FacesContext facesContext = FacesContext.getCurrentInstance();
    Application application = facesContext.getApplication();
    ELContext elContext = facesContext.getELContext();
    ExpressionFactory expressionFactory = application .getExpressionFactory();

    MethodExpression methodExpression = expressionFactory.createMethodExpression(elContext, expression, String.class, new Class[0]);

    outcome = (String) methodExpression.invoke(elContext, new Object[0]);

    if (outcome.equals("whatever")) {
        // set another outcome
    }


    return outcome;

}

}

Приведенный выше код работает, как и ожидалось, но я считаю его довольно громоздким, и он создает выражение ValueExpression для извлечения выражения метода из объявленного атрибута "action".

UIComponentBase предлагает getValueExpression("attributeName"), но нет ничего похожего на MethodExpressions.

Поэтому мой вопрос заключается в том, есть ли лучший способ оценить MethodExpressions, объявленный как атрибуты в составных компонентах, чем приведенный выше код.

Thx

1 Ответ

4 голосов
/ 16 декабря 2011

Получить его как атрибут, а не как выражение значения.

Итак, вместо

ValueExpression ve = getValueExpression("action");

do

MethodExpression me = (MethodExpression) getAttribute("action");
...