ResourceBundle и файл свойств — использование ключей против использования значений

#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 (из Болгарии), вызывается файл свойств для этой локали, и некоторые значения написаны на болгарском языке, и каким-то образом это создает беспорядок.