一、Error attempting to get column 'test_time' from result set. Cause: java.sql.SQLFeatureNotSupported
在原因:前端传入时间日期字符串发送报错
出现错误的原因:因为我的表的test_time类型为DateTime,通过mybatis-plus代码生成器生成的是LocalDateTime,而Java8里面新出来了一些API,LocalDate、LocalTime、LocalDateTime ,但是在默认的情况下,在mybatis里面不支持java8的时间、日期。
上网查找解决办法
更改javabean类中的类型,改为Date类型
修改后
重新测试有报了一个新异常
二、错误:JSON parse error: Cannot deserialize value of type `java.util.Date` from String "2024-08-30T03:15:23.000Z": not a valid representation......
从异常信息来看,可能是日期型数据被序列化为JSON之后,无法转换成java.util.date类型,需要显式的指定一个日期转换格式。将数据获取以后封装到实体类中的时候,就会变成英文的时间格式(Wed Jul 27 02:26:43 CST 2022),而不是yyyy-MM-dd HH:mm:ss格式的时间
解决办法:在对应的bean日期属性上增加注解 @JsonFormat 注解
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", timezone = "UTC")
解释一下:
shape = JsonFormat.Shape.STRING
:这个属性指定了字段在 JSON 中的表现形式。在这个例子中,它被设置为STRING
,意味着该字段在 JSON 中将表示为一个字符串。Jackson 提供了几种不同的形状(Shape
),包括STRING
、NUMBER
(对于时间戳)和OBJECT
(对于更复杂的日期时间表示)。
pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
:这个属性定义了日期时间字符串的格式。在这个例子中,格式遵循了 ISO 8601 标准,但需要注意的是,'Z'
在这里被直接包含在格式字符串中,这实际上可能不是最佳实践,因为它通常表示 UTC 时间(协调世界时),并且应该通过其他方式(如timezone
属性)来处理时区问题。正确的 UTC 时间表示通常不包括'Z'
作为字符串的一部分,而是由库自动处理。如果你确实需要在字符串中包含'Z'
,那么这样是可以的,但请注意它将被视为普通字符而不是时区指示符。
timezone = "UTC"
:这个属性指定了用于格式化日期时间的时区。在这个例子中,它被设置为UTC
,意味着无论原始日期时间是什么时区,它都将被转换为 UTC 时间并相应地格式化。这对于需要确保时间一致性的跨时区应用程序特别有用。
但是这样页面展示的日期时间格式就是2024-08-30T03:15:23.000Z的,是因为前端没有设置时间日期的显示在输入框中的格式。
三、解决显示时间格式带"T" 、"Z"
将前端用到的时间日期选择器添加 value-format="yyyy-MM-dd HH:mm:ss" 属性。
再将后端实体类里的私有变量上的注解@JsonFormat 里的类型改一下,将前后端类型匹配。