#java #jakarta-ee #xhtml #richfaces #facelets
#java #джакарта-ee #xhtml #богатые интерфейсы #facelets
Вопрос:
У меня есть, rich:select
который похож на h:selectOneMenu
, и я использую selectItems
для заполнения выпадающего меню из файла свойств (с помощью ResourceBundle
). Вот проблема, после заполнения выпадающего меню ЗНАЧЕНИЯМИ из файла свойств, и я пытаюсь отправить форму, которую я получаю report_form:overtime_dropdown: Validation Error: Value is not valid
, и меню очищается. Хорошо, я знаю, что это значит, но интересная часть возникает, когда я снова выбираю что-то из меню и отправляю это. Затем форма отправляется.. странно!?! Если я использую ключи из файла свойств для заполнения выпадающего списка, все работает нормально с первого раза. Я публикую часть связанного кода ниже.
report.xhtml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:rich="http://richfaces.org/rich"
xmlns:a4j="http://richfaces.org/a4j">
<h:head>
<link rel="stylesheet" type="text/css" href="resources/css/ticket_style.css" />
</h:head>
<h:body>
<rich:panel header="#{lang.reportPanelHeader}" id="panel">
<h:form id="report_form">
<span class="label">
<h:outputText value="#{lang.overtimeLabel}" />
</span>
<span class="input">
<h:selectBooleanCheckbox value="#{validateReportAction.enabled}">
<f:ajax render="@this overtime_dropdown"/>
</h:selectBooleanCheckbox>
</span>
<br />
<br />
<rich:select styleClass="overtime" enableManualInput="false"
defaultLabel="#{lang.defaultOvertimeLabel}"
disabled="#{!validateReportAction.enabled}"
id="overtime_dropdown"
value="#{validateReportAction.selectedOvertime}">
<f:selectItems value="#{validateReportAction.timeSpentList}" />
</rich:select>
<br />
<br />
<br />
<h:commandButton value="#{lang.submitLabel}"/>
</h:form>
</rich:panel>
</h:body>
</html>
метод заполнения getTimeSpentList() в классе ValidateReportAction
public List<SelectItem> getTimeSpentList() {
System.out.println("################################################# Test " test );
timeSpentList = new ArrayList<SelectItem>();
FacesContext context = FacesContext.getCurrentInstance();
ResourceBundle bundle = ResourceBundle.getBundle("properties.time_intervals", context.getViewRoot().getLocale());
Enumeration<String> time_interval_keys = bundle.getKeys();
List<String> sortedValues = new ArrayList<String>();
opositeOfProperties = new Hashtable<String, String>();
while(time_interval_keys.hasMoreElements()) {
String key = time_interval_keys.nextElement();
String value = bundle.getString(key);
System.out.println("Key: " key ", Value: " value);
opositeOfProperties.put(value, key);
sortedValues.add(value);
// sortedValues.add(key);
}
Collections.sort(sortedValues, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
if (o1.charAt(1) != ' ') {
return -1;
} else if (o2.charAt(1) != ' ') {
return 1;
}
return o1.compareTo(o2);
}
});
for (String value : sortedValues) {
timeSpentList.add(new SelectItem(value));
}
if (timeSpentList == null || timeSpentList.isEmpty()) {
timeSpentList.add(new SelectItem(""));
return timeSpentList;
}
return timeSpentList;
}
}
Комментарии:
1. Обнаружена проблема … поскольку локаль — BG (из Болгарии), вызывается файл свойств для этой локали, и некоторые значения написаны на болгарском языке, и каким-то образом это создает беспорядок.