Форматировать дату в ‹f:selectItem(s) itemLabel› с помощью DateTimeConverter

У меня есть <h:selectOneMenu>, в который загружено <f:selectItems> с CategoryHistory объектами. Я показываю только поле Date date как itemLabel. Это работает, но я хочу отформатировать дату: я создал конвертер, который расширяет javax.faces.convert.DateTimeConverter и меняет поля в конструкторе. Но мои даты отображаются только в формате по умолчанию :(

Конвертер даты и времени.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>

Это также не работает, когда я пытаюсь:

<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 Имеет дату даты и длинный идентификатор +...

Спасибо


person Michael Bavin    schedule 28.01.2010    source источник
comment
Не имеет отношения к реальной проблеме: почему преобразователь объявлен @ManagedBean?   -  person BalusC    schedule 28.01.2010


Ответы (3)


К сожалению, преобразователи JSF применяются только к входному значению, а не к входному ярлыку.

Вам нужно будет решить это другими способами. Например. геттер, который использует SimpleDateFormat для форматирования Дата. Или, если ваша среда поддерживает EL 2.2, просто вызовите метод конвертера напрямую (у вас он уже есть как управляемый компонент):

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

Если вы используете служебную библиотеку JSF OmniFaces, вы также можете использовать ее of:formatDate(). Например.:

<f:selectItems value="#{admin.categoryHistories}" var="n" itemValue="#{n.id}" 
    itemLabel="#{of:formatDate(n.date, 'd MMM yyyy')}">
person BalusC    schedule 28.01.2010
comment
Ой, как больно... Все равно спасибо :) - person Michael Bavin; 28.01.2010
comment
Я люблю OmniFaces, JSF не обходится без этой замечательной библиотеки! - person fareed; 12.10.2017

Вы можете использовать метод конвертера в своем bean-компоненте, например:

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

И на вашей странице xhtml внутри f: selectItems:

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

Пример

xhtml

<h:selectOneMenu value="#{tbMonitoreoController.fechaMonitoreo}">
<f:selectItems value="#{tbMonitoreoController.fechasMonitoreo}" />

Метод в tbMonitoreoController

public SelectItem[] getFechasMonitoreo(){
    Collection<Date> entities = getEjbFacade().getFechasMonitoreo();
    return JsfUtil.getSelectItemsFechasMonitoreo(entities, true);
}

public static SelectItem[] getSelectItemsFechasMonitoreo(Collection<Date> listDate, boolean selectOne) {
    int size = selectOne ? (listDate.size() + 1) : listDate.size();
    SelectItem[] items = new SelectItem[size];
    int i = 0;

    if (selectOne) {
        items[0] = new SelectItem(null, "---");
        i++;
    }
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy");
    for (Date x : listDate) {
        items[i++] = new SelectItem(x, simpleDateFormat.format(x));
    }
    return items;
}

введите здесь описание изображения

person Armando    schedule 23.08.2019