Переопределение XmlAdapter для стороннего библиотечного класса - PullRequest
0 голосов
/ 09 мая 2018

Я генерирую XML, используя jaxbMarshaller для стороннего библиотечного класса. Поскольку библиотека XmlAdapter, которая преобразует объект Calendar в строку, не использует поле TimeZone, маршаллер генерирует неправильный xml для каждого поля Calendar класса pojo.

Сторонняя библиотека XmlAdapter использует приведенный ниже класс для преобразования календаря в строку:

public class DateConversion {
    public static String printDate(Calendar value) {
        if(value != null) {
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
            return format.format(value.getTime());
        }
        return null;
    }
}

Итак, я хочу переопределить поведение поля XmlAdapter for Calendar и попробовал приведенный ниже пример, но, похоже, он не работает:

мой пользовательский XmlAdapter использует приведенный ниже класс для конвертации:

public class DateConversion {
    public static String printDate(Calendar value, TimeZone timeZone) {
        if(value != null) {
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
            format.setTimeZone(timeZone);
            return format.format(value.getTime());
        }
        return null;
    }
}

и тогда я сделал реестр как:

public @Nullable
    String toPdxmlString(final @NotNull Deals input) {
        try {
            final Marshaller marshaller = jaxbContext.createMarshaller();
            final DateFormatterAdapter dateFormatterAdapter = new DateFormatterAdapter(PdxmlDateTimeUtil.FXONLINE_DEFAULT_DEAL_TIMEZONE);
            marshaller.setAdapter(dateFormatterAdapter);
            StringWriter writer = new StringWriter();
            marshaller.marshal(input, writer);
            return writer.toString();
        } catch (JAXBException exception) {
            LOGGER.error("Unable to marshall the given input Deals: {}, into String using JAXB Context: {}, ... ", input, jaxbContext, exception);
        }
        return null;
    }

Может ли кто-нибудь помочь мне узнать, выполнимо ли это или нет, если да, то где я иду не так?

1 Ответ

0 голосов
/ 09 мая 2018

Итак, я нашел свое решение. Я расширил XmlAdapter сторонней библиотеки и добавил поле TimeZone в DateConversion, например:

public class DateFormatterAdapter extends Adapter2 {
    private final TimeZone timeZone;

    public DateFormatterAdapter(final TimeZone timeZone) {
        this.timeZone = timeZone;
    }

    @Override
    public Calendar unmarshal(String value) {
        return javax.xml.bind.DatatypeConverter.parseDate(value);
    }

    @Override
    public String marshal(Calendar calendar) {
        return DateConversion.printDate(calendar, timeZone);
    }
}

Наконец-то зарегистрирован расширенный XmlAdapter как:

public @Nullable
    String toPdxmlString(final @NotNull Deals input) {
        try {
            final Marshaller marshaller = jaxbContext.createMarshaller();
            final DateFormatterAdapter dateFormatterAdapter = new DateFormatterAdapter(PdxmlDateTimeUtil.FXONLINE_DEFAULT_DEAL_TIMEZONE);
            marshaller.setAdapter(Adapter2.class, dateFormatterAdapter);
            StringWriter writer = new StringWriter();
            marshaller.marshal(input, writer);
            return writer.toString();
        } catch (JAXBException exception) {
            LOGGER.error("Unable to marshall the given input Deals: {}, into String using JAXB Context: {}, ... ", input, jaxbContext, exception);
        }
        return null;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...