gpt4 book ai didi

java - JSF:用于 XMLGregorianCalendar 的 dateTimeConverter

转载 作者:行者123 更新时间:2023-11-30 05:52:23 28 4
gpt4 key购买 nike

我正在使用 REST 网络服务并在我的 View 中直接使用 JAXB 对象。一个日期作为 XMLGregorianCalendar,如下所示:

@XmlAttribute(name = "record")
@XmlSchemaType(name = "dateTime")
protected XMLGregorianCalendar record;

在尝试使用标准转换器时

<h:outputText value="#{bean.value.record}" >
<f:convertDateTime pattern="dd.MM.yy" />
</h:outputText>

我在我的 JSF2 环境 (JBoss-7.1.1-Final) 中收到错误消息(翻译成英文)

javax.faces.convert.ConverterException: fSelection:dtSelection:0:j_idt42:
Converting of '2012-07-25T20:15:00' into string not possible.

看来,默认转换器不支持 XMLGregorianCalendar 类型。我想知道是否有针对这种日期类型的 JSF 转换器可用,因为这种要求似乎并没有那么不寻常......

编辑 Ravi 提供了自定义转换器的功能示例,但这似乎不够灵活:

  • 模式是硬编码的
  • 不支持本地用户

最佳答案

值应该是 java.util.Date 类型。

所以像这样从 XMLGregorianCalendar 中获取 Date 对象:

record.toGregorianCalendar().getTime();

更新:

你可以这样使用:

<h:outputText value="#{bean.value.record.toGregorianCalendar().time}" >
<f:convertDateTime pattern="dd.MM.yy" />
</h:outputText>

这实际上应该有效,但既然你说你得到一个 IllegalAccessException,我不确定确切的原因。

或者,如果愿意,您也可以编写自己的转换器,转换器如下所示:

如果您想使用与 dateTimeConverter 相同的属性,则需要将它们作为属性传递给组件并像这样扩展 DateTimeConverter:

@FacesConverter("com.examples.Date")
public class XMLGregorianCalConverter extends DateTimeConverter {
private static final TimeZone DEFAULT_TIME_ZONE = TimeZone.getTimeZone("GMT");
private String dateStyle = "default";
private Locale locale = null;
private String pattern = null;
private String timeStyle = "default";
private TimeZone timeZone = DEFAULT_TIME_ZONE;
private String type = "date";

@Override
public Object getAsObject(FacesContext context, UIComponent component, String newValue) {
// TODO Auto-generated method stub
return null;
}

@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
Map<String, Object> attributes = component.getAttributes();
if(attributes.containsKey("pattern")){
pattern = (String) attributes.get("pattern");
}
setPattern(pattern);
if(attributes.containsKey("locale")){
locale = (Locale) attributes.get("locale");
}
setLocale(locale);
if(attributes.containsKey("timeZone")){
timeZone = (TimeZone) attributes.get("timeZone");
}
setTimeZone(timeZone);
if(attributes.containsKey("dateStyle")){
dateStyle = (String) attributes.get("dateStyle");
}
setDateStyle(dateStyle);
if(attributes.containsKey("timeStyle")){
timeStyle = (String) attributes.get("timeStyle");
}
setTimeStyle(timeStyle);
if(attributes.containsKey("type")){
type = (String) attributes.get("type");
}
setType(type);

XMLGregorianCalendar xmlGregCal = (XMLGregorianCalendar) value;
Date date = xmlGregCal.toGregorianCalendar().getTime();
return super.getAsString(context, component, date);
}

}

并像这样在您的页面上使用:

<h:outputText value="#{bean.value.record}" >
<f:converter converterId="com.examples.Date" />
<f:attribute name="pattern" value="dd.MM.yy" />
</h:outputText>

代码启发/复制自这个问题:JSF convertDateTime with timezone in datatable

关于java - JSF:用于 XMLGregorianCalendar 的 dateTimeConverter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11709936/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com