Rich: календарь, поддерживаемый String, создает исключение - PullRequest
0 голосов
/ 05 марта 2012

У меня есть следующие RichFaces (3.3.3):

    <rich:calendar id="richCal1"                                    
        value="#{user.CreateDate}"
        popup="true" mode="client"
        inputSize="20"
        datePattern="dd/M/yyyy HH:mm"
        enableManualInput="true"
        buttonIcon="/images/calendar.gif">
        <f:convertDateTime type="date" pattern="dd/MM/yyyy HH:mm" />
        <a4j:support bypassUpdates="true" event="oninputblur"  ajaxSingle="true" />
        <a4j:support bypassUpdates="true" event="onchanged" ajaxSingle="true" />
    </rich:calendar>

Тип переменной backbean - String, поскольку столбец, в котором отображается календарь, рассчитывается динамически на основе профиля пользователя и может быть одним из многих типов элементов управления (Label, Input, SelectItem, Rich Calendar) ....

Календарь работает при первой загрузке страницы, и корректное значение для RichCal1 извлекается и отображается (в данном случае 05/03/2012 12:00:00).

Проблема возникает, когда страница нуждается в обновлении (извините за технически некорректное выражение, я попытаюсь объяснить):

На странице есть элемент управления, где пользователь может щелкнуть и настроить свой текущий профиль (дополнительные строки или удалить строки ... и т. Д.). После обновления, чтобы отразить изменение страницы необходимо обновить, где я вижу следующее исключение:

    ERROR: org.ajax4jsf.webapp.BaseXMLFilter - Exception in the filter chain
    javax.servlet.ServletException: myForm:0:richCal1: 'Mon Mar 05 
    12:00:00 EST 2012' could not be understood as a date.

Я не понимаю, как Дата превратилась из 05/03/2012 12:00:00 в 'Mon Mar 05 12:00:00 EST 2012, что является причиной проблемы.

Может кто-нибудь, пожалуйста, просветите меня.

Обновление:

Дальнейшая отладка. Я обнаружил, что когда пользователь обновляет / создает профиль в другом окне, по завершении процесс обновляет родительское окно. Я установил точки останова в установщике / получателе значения Rich: Calendar, и я вижу, что сначала вызывается метод Getter, и он имеет правильно отформатированное значение даты, затем вызывается метод Setter, значение которого устанавливается на Mon Mar 05 12:00:00 EST 2012, после чего создается исключение ! Кто-нибудь знает, почему это происходит?

1 Ответ

1 голос
/ 05 марта 2012

Я решил вышеуказанную проблему, написав Converter, как показано ниже:

    public class CalDateStrConveter implements Converter {
        private String pattern = ApplicationConstant.DD_MM_YYYYHHMM;
                    //eg 02/02/2012 12:00  (note Rich:calendar has no support for seconds)

        public Object getAsObject(FacesContext context, UIComponent component, String value)
                throws ConverterException {

            String result = "";
            SimpleDateFormat sdf = new SimpleDateFormat(pattern);
            if(value!= null && value.length() > 0) {
                try {
                    Date date = sdf.parse(value);
                    result = sdf.format(date);
                } catch (Exception e) {
                    Date date = new Date();
                    logger.error(e.getMessage());
                    FacesMessage facesMessage = new FacesMessage("Invalid Date", value + " is an invalid date. Example " + sdf.format(date));
                    FacesContext.getCurrentInstance().addMessage("DATE PARSE ERROR", facesMessage);
                }
            }

            return result;
        }

        public String getAsString(FacesContext context, UIComponent component, Object value)
                throws ConverterException {

            String result = "";
            String valueStr = (String) value;
            SimpleDateFormat sdf = new SimpleDateFormat(pattern);
            if (valueStr!= null && valueStr.length() > 0) {
                try {
                    Date date = sdf.parse(valueStr);
                    result = sdf.format(date);
                } catch (Exception e) {
                    logger.error(e.getMessage());
                    Date date = new Date();
                    FacesMessage facesMessage = new FacesMessage("Invalid Date", value + " is an invalid date. Example " + sdf.format(date));
                    FacesContext.getCurrentInstance().addMessage("DATE PARSE ERROR", facesMessage);
                }
            }
            return result;
        }

    }

Зарегистрируйте его в faces-config.xml:

     <converter>
        <converter-id>CalDateStrConveter </converter-id>
        <converter-class>com.util.userProd.CalDateStrConveter</converter-class>
     </converter>

и изменил rich: calendar так:

    <rich:calendar id="richCal1"                                    
            value="#{user.CreateDate}"
            popup="true" mode="client"
            inputSize="20"
            datePattern="dd/M/yyyy HH:mm"
            enableManualInput="true"
            buttonIcon="/images/calendar.gif">
            <f:converter converterId="CalDateStrConveter "/>
            <a4j:support bypassUpdates="true" event="oninputblur"  ajaxSingle="true" />
            <a4j:support bypassUpdates="true" event="onchanged" ajaxSingle="true" />
    </rich:calendar>

Надеюсь, это поможет кому-то в подобной должности.Приветствия

...