Joda Time datetime与Spring格式无效

时间:2014-11-25 21:20:00

标签: java spring jackson jodatime

我有一个项目已经使用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

在尝试同时创建IllegalArgumentExceptionDateTime对象时会抛出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"解析为DateTimeLocalDateTime对象,因为它会一直抛出IllegalArgumentException

日期字符串的来源直接来自JPG上传图片的EXIF元数据。目前,我已经回到使用常规java.util.Date对象,因为这些数据仅用于显示和统计信息收集,无需任何操作。

1 个答案:

答案 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;