如何在 java.util.Calendar 字段上映射 IceFaces <ice:selectInputDate> 组件?

Posted

技术标签:

【中文标题】如何在 java.util.Calendar 字段上映射 IceFaces <ice:selectInputDate> 组件?【英文标题】:How to map an IceFaces <ice:selectInputDate> component on a java.util.Calendar field? 【发布时间】:2011-02-15 12:21:12 【问题描述】:

有人知道如何将组件&lt;ice:selectInputDate&gt; 映射到java.util.Calendar 字段,而不是java.util.Date

我使用的是 IceFaces 版本 1.8.2,组件 &lt;ice:selectInputDate&gt;。该组件需要绑定java.util.Date 属性。例如,value="#bean.myDate"myDate 字段的类型必须为 java.util.Date。但我需要我的日期字段为java.util.Calendar 类型。

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

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

    [5/3/10 12:09:18:398 EEST] 00000021 生命周期 I 警告:FacesMessage(s) 已入队,但可能没有 被显示。 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":不能 在类上设置属性“myDate” '...bean...' 值 '5/11/10 3:00 上午'。)]

    自定义一:&lt;f:converter converterId="c2d"/&gt;

    getAsObject - 从提交的String 中返回java.util.Calendar 对象。 getAsString - 接收Object,并返回格式化的String

注意:此方法已被黑客入侵,因此不期望 java.util.CalendargetAsObject 方法互补。相反,被破解的方法getAsString 需要一个java.util.Date,作为参数提供(由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 与 java.util.Date 不兼容 在 com.icesoft.faces.component.selectinputdate.SelectInputDate.getTextToRender(SelectInputDate.java:252)

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

【问题讨论】:

【参考方案1】:

用另一个返回/获取Date 的getter/setter 包装Calendar 属性。

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 converter 不起作用,因为它只进行 ObjectString 转换,而我们需要 ObjectDate 转换。我不使用 IceFaces,但特定组件也有可能接受 certain 格式模式的日期字符串。您需要找出这一点,然后相应地编写 covnerter 以根据此字符串格式模式转换 CalendarStringjava.text.SimpleDateFormat 对此很有帮助。

【讨论】:

您的代码可以指向NullPointerException。 Java 框架的Calendar 类的public final void setTime(Date date) 方法不检查空参数并且这样做:setTimeInMillis(date.getTime());(在Java 1.8 中检查)。在调用setTime 之前,您应该检查空date 参数并重置calendar 成员。【参考方案2】:

按照 BalusC 的建议进行操作,或者直接设置 value="#yourBean.yourCalendar.time

【讨论】:

谢谢你们,你们的解决方案对我帮助很大。祝你好运!

以上是关于如何在 java.util.Calendar 字段上映射 IceFaces <ice:selectInputDate> 组件?的主要内容,如果未能解决你的问题,请参考以下文章

java.util.Date和java.util.Calendar及相关类

如何结合 java.util.Calendar 和 HQL 之间

最佳实践:如何通过 JDBC 检查 SQL.DATE 中的特定 java.util.Calendar/Date?

java类之Calendar类

如何使静态日历线程安全

Java Calendar类