【问题标题】:How to deserialize a String to a Date with Morphia如何使用 Morphia 将字符串反序列化为日期
【发布时间】:2020-08-06 13:59:46
【问题描述】:

我有一个包含这种格式对象的 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;
        }
    }
}

【问题讨论】:

    标签: java json mongodb deserialization morphia


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2022-01-08
      • 2015-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多