JSF: вызов метода Bean с параметром - PullRequest
2 голосов
/ 14 апреля 2011

Я не могу получить вызовы методов с параметрами для работы в JSF 2.0 (MyFaces) и Tomcat 6.

Вот как я это пробую:

<f:selectItems var="item" value="#{bla.someList} itemValue="#{item.value1}" itemLabel="#{item.value2}"> <f:param name="param1" value="0" /> </f:selectItems>

Я не могу определить такой метод, верно?А почему бы и нет?

getSomeList(int a)

Вот что я попробовал:

getSomeList() {
Integer a = Integer.parseInt(FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("param1")); 
return doSomething(a);
}

И вот что я получаю:

java.lang.NumberFormatException: null
java.lang.Integer.parseInt(Integer.java:417)

Буду очень признателенесли бы кто-то помог мне.Спасибо!

ОБНОВЛЕНИЕ: Ах, это сработало с # {bla.getSomeList (0)}!

Ответы [ 2 ]

5 голосов
/ 14 апреля 2011

Я не могу определить такой метод, верно?

getSomeList(int a)

Нет.

А почему бы и нет?

Поскольку вы используете старый Tomcat 6, который не поддерживает EL 2.2, где была представлена ​​эта функция.

Ивот что я получаю:

java.lang.NumberFormatException: null
java.lang.Integer.parseInt(Integer.java:417)

Потому что там это null.<f:param> работает только для ссылок / кнопок, а не для простых компонентов.

Чтобы заставить вызовы методов в EL работать, вам необходимо выполнить обновление до контейнера Servlet 3.0 / EL 2.2, такого как Tomcat 7, или заменить стандартную реализацию EL 2.1 в Tomcat 6 тем, который поддерживает параметризованные вызовы методов.,Подробнее см. этот ответ .После этого вы можете использовать

<f:selectItems value="#{bla.getSomeList(0)}" ... />

Альтернативой является замена List на Map, которая может быть пользовательской реализацией, которая выполняет (ленивую) загрузку по методу get().

public Map<String, List<Something>> getSomeMap() {
    return someCustomLazyLoadingMap;
}

с

<f:selectItems value="#{bla.someMap.keyName}" ... />
0 голосов
/ 14 апреля 2011

Попробуйте использовать

<f:selectItems var="item" value="#{bla.someList(0)} itemValue="#{item.value1}" itemLabel="#{item.value2}"/>

Это работает для некоторых реализаций JSF.

...