Как отобразить компонент IceFaces <ice: selectInputDate> в поле java.util.Calendar? - PullRequest
2 голосов
/ 04 мая 2010

Кто-нибудь знает, как компонент <ice:selectInputDate> может быть отображен в поле java.util.Calendar, а не java.util.Date?

Я использую с IceFaces версия 1.8.2, компонент <ice:selectInputDate>. Этот компонент должен быть связан с java.util.Date proeprty. Например, value="#{bean.myDate}", поле myDate должно иметь тип java.util.Date. Но мне нужно, чтобы мое поле даты было типа java.util.Calendar.

Мои испытания: я пытался использовать стандартный или пользовательский конвертер:

  1. Стандартный: <f:convertDateTime pattern="dd/MM/yyyy" /> форматирует правильное значение в графическом интерфейсе, но при установке его для свойства bean.myDate типа Calendar появляется следующее сообщение об ошибке:

    [03.05.10 12: 09: 18: 398 EEST] 00000021 жизненный цикл I ПРЕДУПРЕЖДЕНИЕ: FacesMessage (s) был поставлен в очередь, но может не иметь был отображен. sourceId = j_id12: j_id189: myDate [серьезность = (ОШИБКА 2), summary = (/ WEB-INF / xhtml ............ file.xhtml @ 507,51 value = "# {bean.myDate}": невозможно установить свойство 'myDate' для класса 'bean' оценивать '5/11/10 3:00 AM'.), деталь = (/ WEB-INF / XHTML ........ file.xhtml @ 507,51 value = "# {bean.myDate}": не могу установить свойство 'myDate' в классе «... боб ...» ценить 5/11/10 3:00 AM.)]

  2. Пользовательский: <f:converter converterId="c2d"/>

    • getAsObject - возвращает объект java.util.Calendar из отправленного String.
    • getAsString - получает Object и возвращает отформатированный String.

ПРИМЕЧАНИЕ: этот метод был взломан, поэтому вместо ожидания java.util.Calendar он будет дополнять метод getAsObject. Вместо этого взломанный метод getAsString ожидает java.util.Date, предоставленный в качестве параметра (ice:selectInputDate), и возвращает отформатированный String.

Но все равно появляется сообщение об ошибке:

[03.05.10 12: 55: 34: 299 EEST] 0000001f D2DFaceletVie E com.icesoft.faces.facelets.D2DFaceletViewHandler renderResponse Проблема в RenderResponse: java.util.GregorianCalendar несовместим с java.util.Date java.lang.ClassCastException: java.util.GregorianCalendar несовместим с java.util.Date на com.icesoft.faces.component.selectinputdate.SelectInputDate.getTextToRender (SelectInputDate.java:252)

Любая подсказка очень полезна! Спасибо, Михаела

Ответы [ 2 ]

4 голосов
/ 04 мая 2010

Оберните свойство Calendar другим получателем / установщиком, возвращающим / получающим Date.

private Calendar calendar;

public Date getCalendarDate() {
    return (calendar != null) ? calendar.getTime() : null;
}

public void setCalendarDate(Date date) {
    if (calendar == null) {
        calendar = Calendar.getInstance();
        calendar.clear(); // Avoid timezone issues.
    }
    calendar.setTime(date);
}

A JSF-конвертер не будет работать, потому что это только преобразования Object <-> String, в то время как нам нужно преобразование Object <-> Date здесь , Я не делаю IceFaces, но может быть шанс, что конкретный компонент также принимает строку даты в шаблоне формата определенный . Вам нужно будет это выяснить, а затем написать соответствующий covnerter для преобразования Calendar <-> String в соответствии с этим шаблоном формата строки. java.text.SimpleDateFormat полезен в этом.

3 голосов
/ 05 мая 2010

Либо сделайте так, как предлагает BalusC, либо просто установите value="#{yourBean.yourCalendar.time}.

...