2010-01-28 12 views
1

J'ai un <h:selectOneMenu> qui a CategoryHistory objets avec CategoryHistory. Je montre seulement le champ Date date comme itemLabel. Cela fonctionne mais je veux mettre en forme la date: J'ai créé un convertisseur qui étend javax.faces.convert.DateTimeConverter et change les champs dans le constructeur. Mais mes dates montrent que dans le format par défaut :(Date du format dans <f: selectItem (s) itemLabel> using DateTimeConverter

DateAndTimeConverter.java

import javax.faces.bean.ManagedBean; 
import javax.faces.convert.Converter; 
import javax.faces.convert.DateTimeConverter; 
import javax.faces.convert.FacesConverter; 

@FacesConverter(value = "dateAndTimeconverter") 
@ManagedBean 
public class DateAndTimeConverter extends DateTimeConverter implements Converter { 

public DateAndTimeConverter(){ 
    this.setDateStyle("short"); 
} 

xhtml

<h:selectOneMenu valueChangeListener="#{admin.categoryHistoryListener}" 
    onchange="submit()" value="#{admin.categoryHistory.id}" converter="#{dateAndTimeconverter}">  
    <f:selectItems value="#{admin.categoryHistories}" var="n" 
    itemValue="#{n.id}" itemLabel="#{n.date}"> 
    </f:selectItems> 
</h:selectOneMenu> 

Il ne fonctionne pas lorsque je tente:

<h:selectOneMenu valueChangeListener="#{admin.categoryHistoryListener}" 
    onchange="submit()" value="#{admin.categoryHistory.id}"> 
    <f:converter converterId="dateAndTimeconverter"/>  
    <f:selectItems value="#{admin.categoryHistories}" var="n" 
    itemValue="#{n.id}" itemLabel="#{n.date}"> 
    </f:selectItems> 
</h:selectOneMenu> 

CategoryHistory a une date de date et id long + ...

Merci

+0

Rien à voir avec le problème réel : pourquoi le convertisseur est-il déclaré '@ ManagedBean'? – BalusC

Répondre

4

Malheureusement, les convertisseurs JSF uniquement sur applique l'entrée valeur, pas sur l'entrée étiquette.

Vous devrez résoudre ce problème autrement. Par exemple. un getter qui utilise SimpleDateFormat pour formater la date. Ou si votre environnement prend en charge EL 2.2, appelez simplement la méthode de conversion directement (vous avez comme managed bean déjà):

<f:selectItems value="#{admin.categoryHistories}" var="n" itemValue="#{n.id}" 
    itemLabel="#{dateAndTimeconverter.getAsString(facesContext, component, n.date)}"> 

Si vous arrive d'utiliser la bibliothèque utilitaire JSF OmniFaces, vous pouvez également utiliser la fonction of:formatDate() . Par exemple:

<f:selectItems value="#{admin.categoryHistories}" var="n" itemValue="#{n.id}" 
    itemLabel="#{of:formatDate(n.date, 'd MMM yyyy')}"> 
+0

Aïe qui fait mal ... Merci quand même :) –

+0

J'aime OmniFaces, JSF n'est pas complet sans cette grande bibliothèque! – fareed

1

Vous pouvez utiliser une méthode de conversion dans votre haricot, comme:

public class Admin{ 
    ... 
     public String formatDate(Date fecha, String pattern) { 
      return (new SimpleDateFormat(pattern)).format(fecha); 
     } 
    ... 
} 

Et, dans votre page xhtml intérieur f: selectItems:

<f:selectItems value="#{admin.categoryHistories}" var="n" 
       itemValue="#{n.id}" itemLabel="#{admin.formatDate(n.date,'d MMM yyyy')}"> 
</f:selectItems>