java - 如何使用 Morphia 将字符串反序列化为日期
问题描述
我有一个带有这种格式对象的 Mongo 集合:
{
id: 1,
date: "2020-08-06T12:00:00Z",
...
}
我有需要从这个集合中读取但从不写入的 Java 代码。写入此集合的进程不归我所有,因此我不一定能更改该日期字符串的格式。我最初尝试像这样对我的 Java Morphia 对象进行建模:
@Entity public class MyDocument {
@Id
private Integer id;
private Date date;
...
}
这不起作用,因为 Morphia 不知道如何将该日期格式反序列化为 Date 对象。我想出的解决方案是将日期视为 POJO 上的字符串,然后使用 getDate() 方法进行实际反序列化。我想知道,我有没有更好的方法来做到这一点?我知道如果您使用的是 Jackson,您可以注释某些字段@JsonDeserialize
并通过反序列化器,所以我想知道 Morphia 是否有类似的东西。
我的解决方案(对我来说不是最理想的):
@Entity public class MyDocument {
@Id
private Integer id;
private String date;
...
private Date getDate() {
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
try {
return dateFormat.parse(date);
} catch (Exception ex) {
return null;
}
}
}
解决方案
您可以继续创建一个简单的转换器,扩展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;
}
}
}
继续为您的文档实体注册您的格式化程序,如下所示:
@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 +
'}';
}
}
这将有效地告诉 Morphia 通过使用所需模式解析字符串来解码数据库传入值,直接生成具体Date
对象,而无需任何额外的转换逻辑。
推荐阅读
- r - R 中的 *metafor* 包是否为稳健的随机效应模型提供森林图
- python - Pandas Dataframe:有没有办法在组内的循环中填充缺失值?
- python - DC-GAN:鉴别器损失上升,而生成器损失下降
- javascript - 在它应该停止之前
- r - 如何在我的数据框中选择具有逻辑运算符“<”(小于)的值,将它们除以二,然后将所有值转换为 as.numeric
- node.js - 在 Windows 上从 bash 运行我的 NodeJS 程序会写入大量空格并且光标会消失
- android - Android导航视图顶部有一排不会走
- reactjs - React 中的 Openlayers 弹出窗口 | 如何?
- jms - createQueueConnection 上的 ActiveMQ Artemis 块
- mongodb - 检查 MongoDB 突变是否会成功而不实际执行它