我有一个项目已经使用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
在尝试同时创建IllegalArgumentException
和DateTime
对象时会抛出LocalDateTime
。
所有这些抛出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
对象,因为这些数据仅用于显示和统计信息收集,无需任何操作。
答案 0 :(得分:0)
看起来您正在注册两个可以处理相同内容的转换器,因此它们竞争相同的类型。 Spring MVC将遍历所有转换器,以查看哪个转换器可以处理内容。
相反,您需要添加两个模块(Joda和Hibernate4)的单个转换器。
BTW你可能想看看Jadira项目,它在Hibernate中为Joda usertypes提供了非常优雅的支持:http://jadira.sourceforge.net/usertype-userguide.html
@Column
@Type(type="org.jadira.usertype.dateandtime.joda.PersistentLocalDateTime")
private LocalDateTime dateTime;