Java 如何使用Morphia将字符串反序列化为日期

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

我有一个Mongo集合,其中包含以下格式的对象:

{
    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 +
        '}';
    }

}