Как программно изменить сериализацию даты JAXB по умолчанию? - PullRequest
12 голосов
/ 17 июня 2011

Есть ли способ изменить способ по умолчанию сериализации / десериализации типов jaxb, даты в моем случае, без указания его посредством аннотации и / или через привязку xml jaxb, как упомянуто здесь http://jaxb.java.net/guide/Using_different_datatypes.html

Я бы хотел сделать что-то вроде:

    JAXBContext jaxbContext = ...;
    Marshaller marshaller = jaxbContext.createMarshaller().setAdapter(new DateAdapter(dateFormat));

Чтобы иметь предварительно сконфигурированный JaxBContext или Marshaller / Unmarshaller, который сериализует / десериализует даты настраиваемым способом.

Не удалось найти какой-либо ресурс, показывающий, как следует ожидать с помощью аннотаций или статически с помощью XML-файла привязки. Спасибо!

Ответы [ 3 ]

13 голосов
/ 25 июня 2011

Это не совсем то, что вы ищете, но это лучше, чем аннотировать каждое поле Дата отдельно. Вы можете установить XmlJavaTypeAdapter на уровне пакета, чтобы каждая ссылка на Date в вашем пакете использовала его. Если ваши объекты находятся в пакете com.example, вы должны добавить к нему файл package-info.java со следующим содержимым:

@XmlJavaTypeAdapter(value=MyCustomDateAdapter.class,type=Date.class)
package com.example;
8 голосов
/ 17 июня 2011

Попробуйте это:

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

@XmlRootElement(name = "event")
public class Event {

    private Date date;
    private String description;

    @XmlJavaTypeAdapter(DateFormatterAdapter.class)
    public Date getDate() {
        return date;
    }

    public void setDate(final Date date) {
        this.date = date;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(final String description) {
        this.description = description;
    }

    private static class DateFormatterAdapter extends XmlAdapter<String, Date> {
        private final SimpleDateFormat dateFormat = new SimpleDateFormat("dd_mm_yyyy");

        @Override
        public Date unmarshal(final String v) throws Exception {
            return dateFormat.parse(v);
        }

        @Override
        public String marshal(final Date v) throws Exception {
            return dateFormat.format(v);
        }
    }

    public static void main(final String[] args) throws Exception {
        final JAXBContext context = JAXBContext.newInstance(Event.class);
        final Marshaller marshaller = context.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

        final Event event = new Event();
        event.setDate(new Date());
        event.setDescription("im rick james");

        marshaller.marshal(event, System.out);
    }
}

Это производит:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<event>
    <date>16_05_2011</date>
    <description>im rick james</description>
</event>
0 голосов
/ 13 апреля 2016

После поиска по всей документации jaxb и по многим учебным пособиям, я не нашел ответа, который мог бы настраивать даты помимо того, что мы жестко программируем в XMLAdapter. Я поместил файл свойств в classpath с форматами даты, например: DateFormat = мм-дд-гггг * * 1 001

Теперь ваша реализация XMLAdapter выглядит следующим образом:

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.xml.bind.annotation.adapters.XmlAdapter;

public class ConfigurableAdapterForDate extends XmlAdapter<String, Date>{

    private static final String FORMAT = "yyyy-mm-dd";
    private String formatFromFile =  null;
    private SimpleDateFormat format = new SimpleDateFormat();

    private void setFormatFromFile() throws IOException {
        //load property file
        Properties prop = new Properties();
        InputStream is = this.getClass().getResourceAsStream("<path to your property file>");
        prop.load(is);

        //get the format from loaded property file
        formatFromFile = prop.getPropertyValue("dateFormat");

        if(formatFromFile != null) {
            format.applyPattern(formatFromFile);
        }
        else {
            format.applyPattern(FORMAT );
        }
    }

    @Override
    public Date unmarshal(String v) throws Exception {
        this.setFormatFromFile();
        return format.parse(v);
    }

    @Override
    public String marshal(Date v) throws Exception {
        this.setFormatFromFile();
        return format.format(v);
    }

}

Теперь вы можете использовать @XmlJavaTypeAdapter (ConfigurableAdapterForDate.class) для объектов даты, которые вы хотите сериализовать / десериализовать. Можно использовать Spring также для загрузки файла свойств. Выше код настроит вашу дату соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...