【发布时间】:2015-01-24 01:21:21
【问题描述】:
我有一个项目已经使用 Jackson Hibernate4Module 进行 ObjectMapping。现在,我想在项目中使用 Joda Time,并添加了
joda-time
joda-time-hibernate
jackson-datatype-joda
到 pom 文件。
在我的配置文件中,我有两个由 configureMessageConverters 调用的转换器初始化程序
@Bean
public MappingJackson2HttpMessageConverter jacksonMessageConverter(){
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new Hibernate4Module());
converter.setObjectMapper(mapper);
return converter;
}
@Bean
public MappingJackson2HttpMessageConverter jodaMessageConverter(){
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JodaModule());
mapper.setDateFormat(new ISO8601DateFormat());
converter.setObjectMapper(mapper);
return converter;
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converterList){
converterList.add(jacksonMessageConverter());
converterList.add(jodaMessageConverter());
super.configureMessageConverters(converterList);
}
并修改了实体中的DateTime字段:
@Column(name = "upload_date", nullable = false)
@Type(type = "org.joda.time.contrib.hibernate.PersistentDateTime")
@DateTimeFormat(pattern="dd/MM/yy hh:mm:ss")
private DateTime uploadDate;
@Column(name = "capture_date", nullable = false)
@Type(type = "org.joda.time.contrib.hibernate.PersistentDateTime")
@DateTimeFormat(pattern="dd/MM/yy hh:mm:ss")
private DateTime captureDate;
但由于未知原因,数据没有持久化到数据库中。我可以看到正在创建域模型对象并设置了适当的日期值。但是,它没有复制到数据库,我得到一个错误
21:15:14.892 [http-bio-8080-exec-3] DEBUG o.s.w.s.m.m.a.RequestResponseBodyMethodProcessor -
Written [[Error uploading file 11-1_mbb0067.jpg
Invalid format: "Sat Nov 01 19:34:51 UTC 2014"]] as "application/json;charset=UTF-8" using
[org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@196c2ab2]
我该如何解决这个问题?
关于多个消息转换器与 Jackson 的适用性的信息为零。
更多信息
给定一个 UTC 时间字符串
Sat Nov 01 20:08:07 UTC 2014
这会在尝试同时创建 DateTime 和 LocalDateTime 对象时引发 IllegalArgumentException。
所有这些都抛出IllegalArgumentExceptions:
LocalDateTime ldt = new LocalDateTime("Sat Nov 01 20:08:07 UTC 2014");
LocalDateTime ldt = LocalDateTime.parse("Sat Nov 01 20:08:07 UTC 2014")
DateTime dt = new DateTime("Sat Nov 01 20:08:07 UTC 2014")
但是,这是可行的:
Date d = new Date("Sat Nov 01 20:08:07 UTC 2014")
更新
无论出于何种原因,JodaTime 似乎都不会将字符串 "Sat Nov 01 20:08:07 UTC 2014" 解析为 DateTime 或 LocalDateTime 对象,因为它会始终抛出 IllegalArgumentException
日期字符串的来源直接来自 JPG 上传图片的 EXIF 元数据。目前,我已经回到使用常规的 java.util.Date 对象,因为数据仅用于显示和统计收集,不需要任何操作。
【问题讨论】:
-
你能发布完整的堆栈跟踪吗?
标签: java spring jackson jodatime