You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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:

  1. 编写转换器类:
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);
    }
}
  1. 页面使用:
    JSF会自动根据属性类型匹配转换器,无需额外配置:
<h:outputText value="#{transaction.date}"/>

也可以显式指定转换器ID(需在@FacesConverter添加value="localDateTimeConverter"):

<h:outputText value="#{transaction.date}" converter="localDateTimeConverter"/>

内容的提问来源于stack exchange,提问作者Mortadha BOUALLAGUI

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 18:35:14