Вызов MethodExpression без параметров в JSF 2.0 - PullRequest
4 голосов
/ 08 сентября 2011

Я пытаюсь вызвать метод без параметров из фасета JSF 2.0 с помощью

#{myBean.foo()}

(без каких-либо окружающих тегов).

Согласно Burns / Schalk: полный справочник: JSF 2.0, что возможно (стр. 126, # {userBean.pullValuesFromFlash ()}).

Однако каркас воспринимает выражение как выражение значения и поэтому считает, что foo должно быть свойством bean-компонента. На JBOSS 7.0.1 (и 6 тоже) я получаю

"Класс '...' не имеет свойства 'foo'"

сообщение об ошибке.

Ответы [ 3 ]

2 голосов
/ 08 сентября 2011

McDowell ответил на причину проблемы: inline выражения обрабатываются как выражения значения, а не как выражения метода.

Что касается того, как в любом случае достичь функциональных требований, используйте <f:event>.

<f:event type="preRenderView" listener="#{myBean.foo}" />

Это вызовет метод непосредственно перед ответом рендеринга.

2 голосов
/ 08 сентября 2011

Судя по этому ответу на форуме JBoss , выражения метода должны использоваться только в атрибутах, которые их поддерживают.

Стэн Сильверт писал:

Мне кажется, это работает, как и ожидалось. Это не имеет ничего общего делать с отсутствием аргументов. Ваше выражение, #{elManagedBean.hello()} рассматривается как выражение ValueExpression. Если Вы изменили свой метод на getHello(), тогда он будет работать. вопрос, следует ли это рассматривать как ValueExpression или MethodExpression? Например, если у вас было такое же выражение в атрибут действия, он будет рассматриваться как MethodExpression.

<h:commandButton value="Hello" action="#{elManagedBean.hello()}" 
     id="submit_button"/>

Вы поместили выражение в середине страница Facelets, а не как значение атрибута. Насколько я знаете, это всегда будет рассматриваться как ValueExpression. Я не вижу как это будет работать в Glassfish. Возможно, что есть некоторые код, который пробует его как ValueExpression, а затем пробует как MethodExpression если не получится. Тем не менее, я думаю, что будет идти против EL спецификация Другими словами, я удивлен, что это будет работать на GlassFish.

0 голосов
/ 13 декабря 2012

Это зависит от версии EL, которую вы используете в своем контейнере сервлета. Если используется Tomcat 6, включается EL 2.1, и он не поддерживает '()' как MethodExpression, если выражение находится в середине страницы Facelets. Tomcat 7, включающий EL 2.2, поддерживает эту и даже расширенные функции, так как он способен передавать параметры в выражение метода:

Итак, вы делаете это:

<h:outputText value="#{object.test(10)}" ></h:outputText>

И получите параметр в вашем бине (может потребоваться дополнительное преобразование и проверка):

public String test(MyObject o)
{
    ...
    return value;
}

Ссылка: http://tomcat.apache.org/whichversion.html Использование EL 2.2 с Tomcat 6.0.24

...