Файл ResourceBundle и Properties - использование ключей против использования значений - PullRequest
1 голос
/ 04 ноября 2011

У меня есть 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;
    }

}
...