Spring Boot JPA仅存储年月报错:String转LocalDate失败的解决
问题解决方法
核心问题分析
- 格式化注解配置错误:实体类中
@DateTimeFormat同时指定了iso = ISO.DATE和错误的pattern = "yyyy, mm",不仅格式与前端的yyyy-MM不匹配,mm还代表分钟(月份需用MM),且iso与pattern同时使用会导致注解逻辑冲突。 - 类型不匹配:
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。
- 创建自定义转换器:
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); } }
- 修改实体类注解:
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
相关产品推荐
相关产品推荐

