Java 如何使用Morphia将字符串反序列化为日期
我有一个Mongo集合,其中包含以下格式的对象:Java 如何使用Morphia将字符串反序列化为日期,java,json,mongodb,deserialization,morphia,Java,Json,Mongodb,Deserialization,Morphia,我有一个Mongo集合,其中包含以下格式的对象: { id: 1, date: "2020-08-06T12:00:00Z", ... } 我有一些Java代码需要从这个集合中读取,但从未写入。写入此集合的进程不属于我,因此我不必更改该日期字符串的格式。我最初尝试对Java Morphia对象进行如下建模: @Entity public class MyDocument { @Id private Integer id; p
{
id: 1,
date: "2020-08-06T12:00:00Z",
...
}
我有一些Java代码需要从这个集合中读取,但从未写入。写入此集合的进程不属于我,因此我不必更改该日期字符串的格式。我最初尝试对Java Morphia对象进行如下建模:
@Entity public class MyDocument {
@Id
private Integer id;
private Date date;
...
}
这不起作用,因为Morphia不知道如何将该日期格式反序列化为日期对象。我提出的解决方案是将日期作为POJO上的字符串处理,然后使用getDate()方法进行实际的反序列化。我想知道,有没有更好的方法让我这样做?我知道如果您使用的是Jackson,您可以使用@JsonDeserialize
注释某些字段,并传递反序列化程序,因此我想知道Morphia是否也有类似的功能
我的解决方案(我觉得不太理想):
您可以继续创建一个简单的转换器,扩展
TypeConverter
,如下所示:
public class DateConverter extends TypeConverter {
private static final String FORMAT = "yyyy-MM-dd'T'HH:mm:ss'Z'";
private final SimpleDateFormat simpleDateFormat;
public DateConverter() {
super(Date.class);
this.simpleDateFormat = new SimpleDateFormat(FORMAT);
}
@Override
public Object decode(Class<?> targetClass, Object fromDBObject, MappedField optionalExtraInfo) {
try {
return simpleDateFormat.parse(((String) fromDBObject));
} catch (ParseException e) {
return null;
}
}
}
这将有效地告诉Morphia通过使用所需模式解析字符串来解码数据库传入值,直接生成一个具体的Date
对象,而无需任何额外的转换逻辑
public class DateConverter extends TypeConverter {
private static final String FORMAT = "yyyy-MM-dd'T'HH:mm:ss'Z'";
private final SimpleDateFormat simpleDateFormat;
public DateConverter() {
super(Date.class);
this.simpleDateFormat = new SimpleDateFormat(FORMAT);
}
@Override
public Object decode(Class<?> targetClass, Object fromDBObject, MappedField optionalExtraInfo) {
try {
return simpleDateFormat.parse(((String) fromDBObject));
} catch (ParseException e) {
return null;
}
}
}
@Entity("Documents")
@Converters(DateConverter.class)
public class Document {
@Id
private Integer id;
public Integer getId() { return id; }
public void setId(Integer id) { this.id = id; }
private Date date;
public Date getDate() { return date; }
public void setDate(Date date) { this.date = date; }
@Override
public String toString() {
return "Document{" +
"id=" + id +
", date=" + date +
'}';
}
}