Сопоставить строку ZonedDateTime с LocalDateTime с помощью анализатора XML на лету - PullRequest
0 голосов
/ 27 сентября 2019

У меня есть строка ответа XML как: <timestamp ts="2018-12-05T08:00:00+02:00">55.5</timestamp>

Я сопоставил это с помощью JAXB и аннотации как:

public class Timestamp {
    @XmlAttribute(name = "ts")
    private String timeStampAsString;
    @XmlValue
    private Double value;

, и все работает как надо, ноЯ хотел бы автоматически проанализировать DateTime из String, поэтому мое идеальное решение должно иметь

public class Timestamp {

    @XmlAttribute(name = "ts")
    private LocalDateTime timeStampAsLocalDateTime;
    @XmlValue
    private Double value;

Я знаю, что могу анализировать строку с помощью:

ZonedDateTime.parse(zonedDateTimeAsString).toLocalDateTime();

Но я не уверен, есть ли способ разобрать это on fly.

1 Ответ

1 голос
/ 27 сентября 2019

Это можно сделать с помощью XmlAdapter.

Создайте класс, который расширяет XmlAdapter, который преобразует String в LocalDateTime

public class LocalDateTimeAdapter extends XmlAdapter<String, LocalDateTime> {

    @Override
    public LocalDateTime unmarshal(String v) throws Exception {
        if (v == null) {
            return null;
        }
        return ZonedDateTime.parse(v).toLocalDateTime();
    }

    @Override
    public String marshal(LocalDateTime v) throws Exception {
        if (v == null) {
            return null;
        }
        return v.toString();
    }
 }

И аннотируйте нужное полепреобразуется в LocalDateTime:

    @XmlAttribute(name="ts")
    @XmlJavaTypeAdapter(LocalDateTimeAdapter.class)
    private LocalDateTime timeStampAsLocalDateTime;

(как уже упоминалось в комментариях LocalDateTime может быть проблематичным, OffsetDateTime или Instant может быть более подходящим. Этот подход будет таким же, просто заменитеклассы и логика разбора)

...