使用f:convertDateTime转换LocalDateTime时抛出指定日期格式化异常
LocalDateTime搭配f:convertDateTime抛出格式化异常的原因与解决办法
问题场景
实体类定义了Java 8新日期类型属性:
private LocalDateTime date;
JSF页面尝试用传统转换器格式化展示:
<h:outputText value="#{transaction.date}"> <f:convertDateTime pattern="dd-MM-yyyy HH:mm:ss"/> </h:outputText>
运行时抛出异常:
java.lang.IllegalArgumentException: Cannot format given Object as a Date
异常原因
f:convertDateTime是JSF针对旧版日期API(java.util.Date、java.util.Calendar)设计的转换器,不支持Java 8引入的JSR-310日期时间类型(包括LocalDateTime)。当转换器接收到LocalDateTime对象时,无法将其识别为可处理的日期类型,因此抛出类型不匹配的异常。
解决办法
方案1:使用JSF 2.3+原生支持的JSR-310转换器
如果项目基于JSF 2.3及以上版本,JSF已经原生提供了针对JSR-310类型的转换器,直接替换为f:convertLocalDateTime即可:
<h:outputText value="#{transaction.date}"> <f:convertLocalDateTime pattern="dd-MM-yyyy HH:mm:ss"/> </h:outputText>
方案2:自定义转换器(适配JSF 2.3以下版本)
若项目使用旧版JSF,需自定义转换器来处理LocalDateTime:
- 编写转换器类:
import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; import javax.faces.convert.Converter; import javax.faces.convert.FacesConverter; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; @FacesConverter(forClass = LocalDateTime.class) public class LocalDateTimeConverter implements Converter<LocalDateTime> { private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss"); @Override public LocalDateTime getAsObject(FacesContext context, UIComponent component, String value) { if (value == null || value.isBlank()) { return null; } return LocalDateTime.parse(value, FORMATTER); } @Override public String getAsString(FacesContext context, UIComponent component, LocalDateTime value) { if (value == null) { return ""; } return FORMATTER.format(value); } }
- 页面使用:
JSF会自动根据属性类型匹配转换器,无需额外配置:
<h:outputText value="#{transaction.date}"/>
也可以显式指定转换器ID(需在@FacesConverter添加value="localDateTimeConverter"):
<h:outputText value="#{transaction.date}" converter="localDateTimeConverter"/>
内容的提问来源于stack exchange,提问作者Mortadha BOUALLAGUI
相关产品推荐
相关产品推荐

