表单提交至Controller时出现java.sql.Time类型转换失败问题
解决表单提交时String转java.sql.Time的类型不匹配问题
嘿,这个问题我太熟悉了——Spring MVC默认的类型转换器没办法把你表单里的10:00这种字符串直接转成java.sql.Time类型,所以才抛出了typeMismatch的错误。给你几个靠谱的解决方案,按需选就行:
方案1:给实体字段加@DateTimeFormat注解
这是最直接的办法,在你的heureDebut字段上添加@DateTimeFormat注解,明确指定时间字符串的格式:
@Entity(name = "horaire") public class Horaire { @Id @GeneratedValue @Column(name = "idhoraire") private Integer id; @Column(name = "heure_debut") @DateTimeFormat(pattern = "HH:mm") // 指定24小时制的时分格式 private java.sql.Time heureDebut; // 其他字段、getter/setter省略 }
这个注解会告诉Spring:“把输入的字符串按照HH:mm的格式解析成java.sql.Time”,完美匹配你输入的10:00格式。如果是12小时制的时间(比如10:00 AM),就把pattern改成hh:mm a。
方案2:全局配置时间格式(Spring Boot适用)
如果你项目里有很多地方需要处理这种格式的时间转换,不想逐个字段加注解,可以在application.properties(或application.yml)里全局配置:
# application.properties spring.mvc.format.time=HH:mm
这样Spring会自动把所有java.sql.Time类型的字段都按照这个格式来解析字符串输入,一劳永逸。
方案3:自定义类型转换器(灵活度最高)
如果你的时间格式比较特殊,或者需要额外的校验逻辑,可以写一个自定义的转换器,注册到Spring的转换服务里:
import org.springframework.core.convert.converter.Converter; import org.springframework.stereotype.Component; import java.sql.Time; import java.time.LocalTime; import java.time.format.DateTimeFormatter; @Component public class StringToSqlTimeConverter implements Converter<String, Time> { // 定义你需要的时间格式 private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:mm"); @Override public Time convert(String source) { // 处理空值情况 if (source == null || source.trim().isEmpty()) { return null; } // 先把字符串转成LocalTime,再转成java.sql.Time LocalTime localTime = LocalTime.parse(source.trim(), TIME_FORMATTER); return Time.valueOf(localTime); } }
只要把这个类加上@Component注解,Spring会自动识别并使用它来处理String到java.sql.Time的转换,非常灵活。
小提示
- 确保你输入的时间字符串和指定的格式完全匹配,比如如果pattern是
HH:mm,就不要输入10:00:00(带秒),否则还是会报错; java.sql.Time本身不存储时区,尽量在前端统一时区后再提交,避免出现时间偏差。
内容的提问来源于stack exchange,提问作者Marian Mereuta
相关产品推荐
相关产品推荐

