2

有谁知道如何将组件<ice:selectInputDate>映射到java.util.Calendar字段上,不是java.util.Date吗?

我使用的是IceFaces版本 1.8.2,组件<ice:selectInputDate>. 这个组件需要绑定一个java.util.Date属性。例如value="#{bean.myDate}",该myDate字段的类型必须为java.util.Date。但我需要我的日期字段是 type java.util.Calendar

我的试验:我尝试使用标准转换器或自定义转换器:

  1. 标准一:<f:convertDateTime pattern="dd/MM/yyyy" /> 它格式化正确的 GUI 中的值,但是在bean.myDate类型的属性上设置它时,Calendar我收到以下错误消息:

    [5/3/10 12:09:18:398 EEST] 00000021 生命周期 I 警告:FacesMessage 已入队,但可能尚未显示。sourceId=j_id12:j_id189:myDate[severity=(ERROR 2), summary=(/WEB-INF/xhtml............file.xhtml @507,51 value="#{bean. myDate}": 无法将类 'bean' 上的属性 'myDate' 设置为值 '5/11/10 3:00 AM'。),detail=(/WEB-INF/xhtml........ file.xhtml @507,51 value="#{bean.myDate}":无法将类 '...bean...' 上的属性 '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,作为参数(by ice:selectInputDate)提供并返回String格式化的。

但仍然出现错误消息:

[5/3/10 12:55:34:299 EEST] 0000001f D2DFaceletVie E com.icesoft.faces.facelets.D2DFaceletViewHandler renderResponse 渲染响应中的问题:java.util.GregorianCalendar 与 java.util.Date 不兼容 java.lang.ClassCastException: java.util.GregorianCalendar 与 com.icesoft.faces.component.selectinputdate.SelectInputDate.getTextToRender 的 java.util.Date 不兼容(SelectInputDate.java:252)

任何提示都非常有用!谢谢,米哈埃拉

4

2 回答 2

4

用另一个getter Calendar/setter 返回/获取一个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);
}

JSF 转换器不会工作,因为它只进行Object<-->String转换,而我们这里需要Object<-->Date转换。我不使用 IceFaces,但特定组件也有可能接受某种格式模式的日期字符串。您需要找出这一点,然后相应地编写 covnerter 以根据此字符串格式模式转换Calendar<--> 。String对此java.text.SimpleDateFormat很有帮助。

于 2010-05-04T15:48:19.330 回答
3

要么按照 BalusC 的建议进行操作,要么简单地设置value="#{yourBean.yourCalendar.time}.

于 2010-05-05T16:21:30.373 回答