首页 > 解决方案 > 如何使用 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;
        }
    }
}

标签: javajsonmongodbdeserializationmorphia

解决方案


您可以继续创建一个简单的转换器,扩展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对象,而无需任何额外的转换逻辑。


推荐阅读