带有 spring-data-jdbc 和 postgres 的 springboot:时间戳上的尾随垃圾

问题描述

spring boot 2.2.11 升级到 2.3.9 后,我们应用程序中的一些数据库查询停止工作。当我降级到 2.3.8 时,它们再次工作。 所以从2.3.8到2.3.9肯定是有什么变化,但我还是没弄明白是什么。

我们使用 spring-data-jdbc 和 postgres 数据库。我们的存储库扩展了 CrudRepository:

public interface ExampleRepository extends CrudRepository<Example,Long>

有问题的查询如下所示:

@Query("SELECT * FROM example WHERE updated_at > :lastUpdate")
List<Example> findByUpdatedAtGreaterThan(@Param("lastUpdate") OffsetDateTime lastUpdate);

实体都扩展了一个类 BaseEntity,它有一个字段 private Timestamp updatedAt;

数据库列是使用 flyway 脚本设置的: updated_at TIMESTAMPTZ NOT NULL DEFAULT Now()

这个时间戳是在 BeforeSaveEvent 上自动设置的:

this.updatedAt = Timestamp.from(Instant.Now().truncatedTo(ChronoUnit.MILLIS)));

控制器方法需要一个请求参数

@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) OffsetDateTime lastUpdate

并收到类似 2011-01-01T10:20:30.123Z 传递给服务和存储库方法

现在在 org.postgresql.jdbc.Timestamputils (postgrsql-42.2.18-sources.jar) 中,我在方法中看到参数 lastUpdate

public synchronized @polyNull Timestamp toTimestamp(@Nullable Calendar cal,@polyNull String s)

然后private ParsedTimestamp parseBackendTimestamp(String str)

parseBackendTimestamp() 似乎需要一个时间戳,在日期和时间之间有一个空格,而不是一个“T”,所以我们得到了这一行

throw new NumberFormatException("Trailing junk on timestamp: '" + new String(s,start,slen - start) + "'");

结果:“时间戳上的尾随垃圾:'T10:20:30.123Z'”

我不知道为什么将参数传递到 parseBackendTimestamp() 中。使用 spring boot 2.3.8 这不会发生,postgresql 版本是相同的,42.2.18。 2.3.9 的 release notes 提到升级到 Spring Data Neumann-SR7,它带来了 弹簧数据 JDBC 2.0.7。 change log for 2.0.7 很短,只是一个似乎无关的错误修正。

知道这里发生了什么吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)