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 コンバーターが利用可能かどうか疑問に思っています...

編集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 から Calendar または Date に変換することができます: How do I Customize date/time bindings using JAXWS and APT?

于 2012-07-29T16:32:22.243 に答える