2

我正在使用 REST Web 服务并在我的视图中直接使用 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 转换器是否可用,因为这个要求似乎并不那么不寻常......

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

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

2 回答 2

6

该值应为 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

于 2012-07-29T16:37:12.867 回答
0

您可以注册一个自定义 XML 适配器,以按照以下方式从 XMLGregorianCalendar 转换为日历或日期:如何使用 JAXWS 和 APT 自定义日期/时间绑定?

于 2012-07-29T16:32:22.243 回答