2012-05-15 2 views
1

Я сталкиваюсь с некоторыми проблемами при попытке получить доступ к некоторым свойствам с параметрами. Ну, я не знаю, следует ли их называть свойствами, поскольку у аксессуаров есть параметры, но теперь можно назвать их свойствами.Проблемы с JSF 2.0 и параметризованные выражения EL

Ситуация такова:

У меня есть класс Student, который содержит различные локализаций как объекты в карте. Я могу получить эти объекты локализации, делая это:

student.getLocalizedData(String localizationCode); 

Теперь на странице, я пытаюсь сделать это: описание

<h:inputText value="#{collegeBean.student.getLocalizedData('es').profileDescription}"/> 

студента может иметь много локализаций.

Страница загружается правильно, но когда я пытаюсь спасти ученика, он говорит, что у bean collegeBean нет свойства getLocalizedData, жестко, что это свойство учащегося, содержащегося в bean-компоненте.

Я знаю, что линия ума, поэтому я попытался обернуть его:

<h:inputText value="#{collegeBean.getStudentLocalizedData('es').profileDescription}"/> 

Увы, опять-таки я получаю такое же сообщение.

Единственное, что я нашел, это сделать метод, который полностью обертывает spinperty studen't ... но это оставляет меня с двумя методами (get + set) для каждой локализации, и это только для одного свойства. Это означает, что я закончу наличие (2 x локализации x атрибутов) количества методов !.

Есть ли какой-либо подход, который я могу предпринять, чтобы решить эту проблему наиболее динамично? В будущем количество локализаций может измениться, и я не хочу менять какой-либо код.

EDIT: Я использую JBoss 6.1.0.Final и реализации JSF, что происходит с ним Jsf 2.0.3-b05

ответ

2

Это теоретически должно работать, так что я подозреваю, что ошибка или оплошность в используется реализация EL. Возможно, вы захотите попробовать другую реализацию EL (другой сервер) или обновить сервер. Если зря, сообщите об этом как об ошибке для поставщика сервера.

Однако, поскольку вы фактически делегируете getLocalizedData() на Map, лучше не делать этого, а вместо этого возвращать целое Map напрямую.

public Map<String, LocalizedData> getLocalizedData() { 
    return localizedData; 
} 

, так что вы можете использовать его следующим образом

<h:inputText value="#{collegeBean.student.localizedData.es.profileDescription}"/> 

или, при желании

<h:inputText value="#{collegeBean.student.localizedData['es'].profileDescription}"/> 
+0

Я собираюсь на карте. Что касается реализации, я использую реализацию JSF, которая поставляется с JBoss 6.1.0.Final. Это была важная часть вопроса, извините, я пропустил ее. – Gamb

+0

EL не привязан к JSF impl, но к контейнеру servletcontainer, который находится в вашем случае, таким образом, JBoss 6.1.0 (который под крышками использует Apache EL, как и Tomcat). – BalusC

+0

Я этого не знал! Однако вариант карты работал как шарм. Спасибо, мужик! ты жжешь!. – Gamb

1

По моему опыту, большинство реализаций EL, которые принимают параметры глючат в той или иной , Тот, которым я больше всего доволен, является EL Tomcat 7.

Обратите внимание, что вы можете использовать пользовательскую реализацию EL с Mojarra и MyFaces. Я обычно связываю Tomcat с моими приложениями, поэтому могу доверять стабильному набору функций, доступному. Однако вы должны быть осторожны, так как вы можете столкнуться с проблемами с загрузчиками классов, если вы не настроите все правильно.

Mojarra:

<context-param> 
    <param-name>com.sun.faces.expressionFactory</param-name> 
    <param-value>YOUR EL IMPLEMENTATION EXPRESSION FACTORY</param-value> 
</context-param> 

MyFaces:

<context-param> 
    <param-name>org.apache.myfaces.EXPRESSION_FACTORY</param-name> 
    <param-value>YOUR EL IMPLEMENTATION EXPRESSION FACTORY</param-value> 
</context-param>