Как десериализовать строку в дату с помощью Morphia - PullRequest
0 голосов
/ 06 августа 2020

У меня есть коллекция Mon go с объектами этого формата:

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

1 Ответ

1 голос
/ 06 августа 2020

Вы можете go вперед и создать простой конвертер, расширяющий 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;
        }
    }

}

впереди go и зарегистрировать модуль форматирования для объекта документа следующим образом:

@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 без каких-либо дополнительных logi преобразования c.

...