JSF核心标记f:convertDateTime可以格式化java.util.Date个对象。 Date类有许多不推荐使用的方法,Java 8提供了新的类来显示本地日期和时间:LocalDateTime和LocalDate。
f:convertDateTime无法格式化LocalDateTime或LocalDate。
有没有人知道,如果有一个等价的JSF核心标记convertDateTime可以处理LocalDateTime对象?计划是为将来的版本提供支持,还是提供替代标签?
答案 0 :(得分:5)
编写自己的转换器并扩展javax.faces.convert.DateTimeConverter
- 这样您就可以重用<f:convertDateTime>
支持的所有属性。它也会照顾本地化。不幸的是,编写带属性的转换器会有点复杂。
javax.faces.convert.DateTimeConverter
的转换器 - 让超级调用完成所有工作(包括locale-stuff)并将结果从/转换为LocalDate。@FacesConverter(value = LocalDateConverter.ID) public class LocalDateConverter extends DateTimeConverter { public static final String ID = "com.example.LocalDateConverter"; @Override public Object getAsObject(FacesContext facesContext, UIComponent uiComponent, String value) { LocalDate ldate = null; Date date = null; Object o = super.getAsObject(facesContext, uiComponent, value); if(o == null) { return null; } if (o instanceof Date) { date = (Date) o; Instant instant = Instant.ofEpochMilli(date.getTime()); ldate = LocalDateTime.ofInstant(instant, ZoneId.systemDefault()).toLocalDate(); return ldate; } else{ throw new IllegalArgumentException(String.format("value=%s could not be converted to a LocalDate, result super.getAsObject=%s",value,o)); } } @Override public String getAsString(FacesContext facesContext, UIComponent uiComponent, Object value) { if(value == null){ return super.getAsString(facesContext, uiComponent,value); } if (value instanceof LocalDate) { LocalDate lDate = (LocalDate) value; Instant instant = lDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant(); Date date = Date.from(instant); return super.getAsString(facesContext, uiComponent,date); } else{ throw new IllegalArgumentException(String.format("value=%s is not a instanceof LocalDate",value)); } } }
LocalDateConverter-taglib.xml
中创建文件META-INF
:<facelet-taglib version="2.2" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facelettaglibrary_2_2.xsd"> <namespace>http://example.com/LocalDateConverter</namespace> <tag> <tag-name>convertLocalDate</tag-name> <converter> <converter-id>com.example.LocalDateConverter</converter-id> </converter> </tag> </facelet-taglib>
web.xml
:<context-param> <param-name>facelets.LIBRARIES</param-name> <param-value>/META-INF/LocalDateConverter-taglib.xml</param-value> </context-param>
xmlns:ldc="http://example.com/LocalDateConverter"
然后您可以使用标记<ldc:convertLocalDate type="both" dateStyle="full"/>
。