我正在使用Angular日期选择器向我的MVC控制器发送日期,使用ISO Date日期对象/ 时间。杰克逊从ISO反序列化Joda LocalDate DateTime
关于反序列化java.util.Date
它的作用就像一个魅力,Hibernate会关心在插入记录时将那个时间切割成普通日期。
但现在我正在从java.util.Date
转换到org.joda.time.[APPROPRIATE_CLASS_HERE]
我正面临着这个反序列化问题。
我的理解是,如果我在我的DTO中强制DateTime
,Jackson会正确反序列化它们,而我更倾向于在目标类型为Date时删除时间信息。
E.g.
public class UserDto {
private LocaLDate passwordExpirationDate;
}
{
"username":"9493",
"completeName":"ljdjf",
"email":"[email protected]",
"cultureId":"IT",
"enabled":false,
"passwordExpirationDate":"2017-07-13T10:00:00.000Z",
"accountExpirationDate":"2017-07-20T10:00:00.000Z"
}
相反,我得到这个:
org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Invalid format: "2017-07-13T10:00:00.000Z" is malformed at "T10:00:00.000Z"; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Invalid format: "2017-07-13T10:00:00.000Z" is malformed at "T10:00:00.000Z" (through reference chain: it.phoenix.web.data.dtos.admin.profile.UserDTO["passwordExpirationDate"])
at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:244) ~[spring-web-4.3.9.RELEASE.jar:4.3.9.RELEASE]
Caused by: com.fasterxml.jackson.databind.JsonMappingException: Invalid format: "2017-07-13T10:00:00.000Z" is malformed at "T10:00:00.000Z" (through reference chain: it.phoenix.web.data.dtos.admin.profile.UserDTO["passwordExpirationDate"])
at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:388) ~[jackson-databind-2.8.9.jar:2.8.9]
Caused by: java.lang.IllegalArgumentException: Invalid format: "2017-07-13T10:00:00.000Z" is malformed at "T10:00:00.000Z"
at org.joda.time.format.DateTimeFormatter.parseLocalDateTime(DateTimeFormatter.java:900) ~[joda-time-2.9.9.jar:2.9.9]
at org.joda.time.format.DateTimeFormatter.parseLocalDate(DateTimeFormatter.java:844) ~[joda-time-2.9.9.jar:2.9.9]
at com.fasterxml.jackson.datatype.joda.deser.LocalDateDeserializer.deserialize(LocalDateDeserializer.java:39) ~[jackson-datatype-joda-2.8.9.jar:2.8.9]
at com.fasterxml.jackson.datatype.joda.deser.LocalDateDeserializer.deserialize(LocalDateDeserializer.java:15) ~[jackson-datatype-joda-2.8.9.jar:2.8.9]
at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:504) ~[jackson-databind-2.8.9.jar:2.8.9]
at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:104) ~[jackson-databind-2.8.9.jar:2.8.9]
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:357) ~[jackson-databind-2.8.9.jar:2.8.9]
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:148) ~[jackson-databind-2.8.9.jar:2.8.9]
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3814) ~[jackson-databind-2.8.9.jar:2.8.9]
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2938) ~[jackson-databind-2.8.9.jar:2.8.9]
at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:241) ~[spring-web-4.3.9.RELEASE.jar:4.3.9.RELEASE]
... 92 more
问题是:有一个聪明的办法让杰克逊可以通过简单的剥离,在默认情况下,部分时间/当前时区DateTime对象解码成乔达LocalDate
?
注: - 我已经有杰克逊乔达模块依赖 - 杰克逊是2.8.9 - 我不得不使用Java 7。在相关的Java 8项目我没有这样的问题java.time
东西(和杰克逊JSR310模块)
任何机会,在全球范围内应用此之后... ... EHM类路径范围内? –
另外...我刚完成测试提议的解决方案。我会发布它作为答案。如果您可以帮助我将上述内容应用于LocalDate类型的每个属性,我将授予您接受的答案,因为我不喜欢我的解决方案 –
如何配置杰克逊?你是手动创建ObjectMapper还是使用Angular特定的配置文件来配置它? – 2017-07-19 17:21:19