自从升级到 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 而不是时间戳类型