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

Spring Boot JPA仅存储年月报错:String转LocalDate失败的解决

问题解决方法

核心问题分析

  1. 格式化注解配置错误:实体类中@DateTimeFormat同时指定了iso = ISO.DATE和错误的pattern = "yyyy, mm",不仅格式与前端的yyyy-MM不匹配,mm还代表分钟(月份需用MM),且iso与pattern同时使用会导致注解逻辑冲突。
  2. 类型不匹配:LocalDate要求完整的年月日信息,但前端仅传入年月(如2022-05),缺少日期部分,直接转换会失败。

方案一:改用YearMonth类型(推荐)

YearMonth是Java 8+专门用于表示年月的类型,完全匹配前端输入的业务场景,且Hibernate 5.2+已支持该类型与数据库字段的映射。

修改实体类代码:

public class Fatura {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "mes_referencia")
    @DateTimeFormat(pattern = "yyyy-MM")
    private YearMonth mesReferencia;

    // 访问器方法(getter/setter)
}
  • 数据库中该字段可存储为DATE类型,YearMonth会自动映射为该月的第一天(如2022-05-01);若需精确存储yyyy-MM格式,也可将数据库字段设为VARCHAR(7)。

方案二:保留LocalDate并补全日期信息

若业务必须使用LocalDate,需自定义转换器,将前端传入的年月字符串补全为当月第一天的LocalDate。

  1. 创建自定义转换器:
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;
import java.time.LocalDate;
import java.time.YearMonth;

@Component
public class StringToLocalDateConverter implements Converter<String, LocalDate> {
    @Override
    public LocalDate convert(String source) {
        if (source == null || source.isEmpty()) {
            return null;
        }
        // 将yyyy-MM格式字符串转为当月第一天的LocalDate
        YearMonth yearMonth = YearMonth.parse(source);
        return yearMonth.atDay(1);
    }
}
  1. 修改实体类注解:
public class Fatura {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "mes_referencia")
    @DateTimeFormat(pattern = "yyyy-MM")
    private LocalDate mesReferencia;

    // 访问器方法(getter/setter)
}

Spring会自动识别并使用自定义转换器,完成yyyy-MM到LocalDate的转换。


前端代码说明

前端<input type="month">本身会返回yyyy-MM格式的字符串,无需额外修改,pattern="yyyy-MM"可保留用于前端输入校验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 17:24:29