如何在 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 【问题描述】:有人知道如何将组件<ice:selectInputDate>
映射到java.util.Calendar
字段,而不是java.util.Date
?
我使用的是 IceFaces 版本 1.8.2,组件 <ice:selectInputDate>
。该组件需要绑定java.util.Date
属性。例如,value="#bean.myDate"
,myDate
字段的类型必须为 java.util.Date
。但我需要我的日期字段为java.util.Calendar
类型。
我的试验:我尝试使用标准转换器或自定义转换器:
标准一:<f:convertDateTime pattern="dd/MM/yyyy" />
它的格式更正了 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 上午'。)]
自定义一:<f:converter converterId="c2d"/>
String
中返回java.util.Calendar
对象。
getAsString - 接收Object
,并返回格式化的String
。
注意:此方法已被黑客入侵,因此不期望 java.util.Calendar
与 getAsObject
方法互补。相反,被破解的方法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 不起作用,因为它只进行 Object
String
转换,而我们需要 Object
Date
转换。我不使用 IceFaces,但特定组件也有可能接受 certain 格式模式的日期字符串。您需要找出这一点,然后相应地编写 covnerter 以根据此字符串格式模式转换 Calendar
String
。 java.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 之间