自从升级到 spring boot 1.4 / spring cloud camden 以来,BeanPropertyRowMapper 不再理解 joda 时间类型

Posted

技术标签:

【中文标题】自从升级到 spring boot 1.4 / spring cloud camden 以来,BeanPropertyRowMapper 不再理解 joda 时间类型【英文标题】:BeanPropertyRowMapper does not understand joda time types anymore since upgrading to spring boot 1.4 / spring cloud camden 【发布时间】:2017-01-21 01:08:54 【问题描述】:

我有一个 Spring Batch Job,它定义了一个 JdbcPagingItemReader 和一个 BeanPropertyRowMapper

JdbcPagingItemReader<RawNotice> reader = new JdbcPagingItemReader<>();
final SqlPagingQueryProviderFactoryBean sqlPagingQueryProviderFactoryBean = new SqlPagingQueryProviderFactoryBean();
sqlPagingQueryProviderFactoryBean.setDataSource(dataSource);
sqlPagingQueryProviderFactoryBean.setSelectClause("select *");
sqlPagingQueryProviderFactoryBean.setFromClause("from a_table");
sqlPagingQueryProviderFactoryBean.setWhereClause("state = :state");
sqlPagingQueryProviderFactoryBean.setSortKey("id");

Map<String, Object> parameters = new HashMap<>();
parameters.put("state", "interesting_state");

reader.setQueryProvider(sqlPagingQueryProviderFactoryBean.getObject());
reader.setDataSource(dataSource);
reader.setPageSize(10);
// The line below is the interesting one
reader.setRowMapper(new BeanPropertyRowMapper<>(MyEntity.class));
reader.setParameterValues(parameters);
return reader;

这曾经可以正常工作,但是由于我们升级到 spring boot 1.4 和 spring cloud Camden,它抛出了一个异常:

org.springframework.beans.ConversionNotSupportedException:无法将类型 [java.sql.Timestamp] 的属性值转换为属性“ADateColumn”所需的类型 [org.joda.time.LocalDateTime];嵌套异常是 java.lang.IllegalStateException:无法将类型 [java.sql.Timestamp] 的值转换为属性“ADateColumn”所需的类型 [org.joda.time.LocalDateTime]:找不到匹配的编辑器或转换策略

列 ADateColumn 被声明为 Joda LocalDateTime 并作为 java.sql.Timestamp 存储在数据库中。

我很清楚我可以将自己的 joda 转换器添加到 BeanPropertyRawMapper 转换服务中,或者创建一个了解 Java LocalDateTime 的 PropertyEditor,但这看起来更像是一个配置问题,就像没有正确注册一样。

任何人有解决此问题的解决方案/建议?

谢谢!


这是造成问题的实体部分:

@Entity
@EqualsAndHashCode(of =  "..." )
@ToString(of =  .... )
public class MyEntity 

    @Getter
    @Setter
    @Id
    @GeneratedValue
    private Long id;

    @Getter
    @Version
    @Column(nullable = false)
    private int version;

    //<--- snip --->

    @Getter
    @Setter
    @Type(type = "org.jadira.usertype.dateandtime.joda.PersistentLocalDateTime")
    private LocalDateTime aDateColumn;


Hibernate 是版本 4.3.11.Final

JPA 是带有 Hibernate Entity Manager 4.3.11.Final 的 2.1 版

【问题讨论】:

请参考jira.spring.io/si/jira.issueviews:issue-html/SPR-13888/… 是的,我见过,但它指的是java.time.LocalDateTime而不是org.joda.LocalDateTime ... 您能告诉我们您对实体的定义吗?以及 Hibernate/JPA 版本。 @NghiaDo:给你。谢谢! 【参考方案1】:

所以我最终使用自定义 Joda 转换器创建了自己的 BeanPropertyRowMapper:/

【讨论】:

以上是关于自从升级到 spring boot 1.4 / spring cloud camden 以来,BeanPropertyRowMapper 不再理解 joda 时间类型的主要内容,如果未能解决你的问题,请参考以下文章

TypeNotPresentExceptionProxy,将Spring Boot Starter父级从2.1.8升级到2.2.1

Intellij 找不到我的 Spring Boot 应用程序

Spring Boot 1.4:LocalDateTime 映射到 varbinary 而不是时间戳类型

Spring Boot 1.4 QueryDSL 依赖问题

Spring Data + Hibernate 5 (Spring Boot 1.4) - 获取弃用消息

Spring Boot 2.0干货系列:Spring Boot1.5X升级到2.0指南