使用Spring Boot 1.4.4.RELEASE,已将RequestBody
保存到MongoDB,如下所示:
{
"startTime" : NumberLong("1483542955570"),
"startDate" : ISODate("2017-01-04T15:15:55.570Z"),
"endTime" : NumberLong("1483542955570"),
"endDate" : ISODate("2017-01-04T15:15:55.570Z")
}
在将其映射回Java POJO时,我正在尝试下面的代码。
public <T> T getPOJOFromMongoDocument(Document resourceDocument, Class<T> clazz) {
String serialize = JSON.serialize(resourceDocument);
return objectMapper.readValue(serialize,
clazz);
}
serialize的日期字段返回如下
"startDate" : { "$date" : "2017-01-04T15:15:55.570Z"}
由于$date
,杰克逊ObjectMapper
在解析期间返回以下异常:
java.lang.RuntimeException: Error parsing mongoDoc to Pojo : errorMessage : {Can not deserialize instance of java.util.Date out of START_OBJECT token at [Source: {
"startTime": 1483542955570,
"startDate": {
"$date": "2017-01-04T15:15:55.570Z"
},
"endTime": 1483542955570,
"endDate": {
"$date": "2017-01-04T15:15:55.570Z"
}}; line: 1, column: 381] (through reference chain: com.gofynd.engine.mongo.models.RuleWithDataVO["validity"]->com.gofynd.engine.mongo.models.ValidityVO["startDate"])}
有没有办法在不使用ODM的情况下解决这个问题?
答案 0 :(得分:4)
反序列化为Date
时杰克逊需要String
"2017-01-04T15:15:55.570Z"
。相反,它会在JSON中看到另一个对象({
char)的开头,因此是异常。
考虑指定您的Pojo
类和与此类似的另一个MongoDate
类:
class MongoDate {
@JsonProperty("$date")
Date date;
}
class Pojo {
long startTime;
long endTime;
MongoDate startDate;
MongoDate endDate;
}
或者,如果您不能/不想添加MongoDate
课程,则可以为Date
字段引入自定义反序列化程序。在这种情况下Pojo
:
class Pojo {
long startTime;
long endTime;
@JsonDeserialize(using = MongoDateConverter.class)
Date startDate;
@JsonDeserialize(using = MongoDateConverter.class)
Date endDate;
}
反序列化器看起来像这样:
class MongoDateConverter extends JsonDeserializer<Date> {
private static final SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
@Override
public Date deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
JsonNode node = jp.readValueAsTree();
try {
return formatter.parse(node.get("$date").asText());
} catch (ParseException e) {
return null;
}
}
}
答案 1 :(得分:-1)
我回去尝试了类似的使用解串器的方法。
以下是代码:
public class MongoDateDeserializer extends JsonDeserializer<Date> {
@Override
public Date deserialize(JsonParser jsonParser, DeserializationContext deserializationContext)
throws IOException {
ObjectCodec oc = jsonParser.getCodec();
JsonNode node = oc.readTree(jsonParser);
String dateValue = node.get("$date")
.asText();
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
Date date = null;
try {
date = df.parse(dateValue);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}}
VO的变化如下:
@JsonDeserialize(using = MongoDateDeserializer.class)
private Date startDate;
@JsonDeserialize(using = MongoDateDeserializer.class)
private Date endDate;
这已成功运作。 但是,如果MongoDB的JSON.serialize完成返回规范化json的工作会更好。希望将来。