【问题标题】:Joda Time datetime invalid format with SpringJoda Time datetime 格式与 Spring 无效
【发布时间】: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

这会在尝试同时创建 DateTimeLocalDateTime 对象时引发 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" 解析为 DateTimeLocalDateTime 对象,因为它会始终抛出 IllegalArgumentException

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

【问题讨论】:

  • 你能发布完整的堆栈跟踪吗?

标签: java spring jackson jodatime


【解决方案1】:

看起来您正在注册两个可以处理相同内容的转换器,因此它们在竞争相同的类型。 Spring MVC 将遍历所有转换器以查看哪个转换器可以处理内容。

相反,您需要一个添加了两个模块(Joda 和 Hibernate4)的转换器。

顺便说一句,您可能想看看 Jadira 项目,它在 Hibernate 中为 Joda 用户类型提供了非常优雅的支持:http://jadira.sourceforge.net/usertype-userguide.html

@Column
@Type(type="org.jadira.usertype.dateandtime.joda.PersistentLocalDateTime")
private LocalDateTime dateTime;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    • 1970-01-01
    • 2023-04-09
    • 2017-01-11
    • 2011-06-18
    • 2021-04-14
    • 2013-12-18
    相关资源
    最近更新 更多