Как программно изменить стандартную сериализацию даты JAXB по умолчанию?
Есть ли способ изменить способ по умолчанию jaxb serialize/deserialize, даты в моем случае, без указания его посредством аннотации и/или с помощью связывания jaxb xml, как указано здесь
http://jaxb.java.net/guide/Using_different_datatypes.html
Мне бы хотелось сделать что-то вроде:
JAXBContext jaxbContext = ...;
Marshaller marshaller = jaxbContext.createMarshaller().setAdapter(new DateAdapter(dateFormat));
Чтобы иметь предварительно сконфигурированный JaxBContext или Marshaller/Unmarshaller, которые сериализуют/десериализуют даты по-отдельности..
Не удалось найти какой-либо ресурс, который показывает, как можно ожидать через аннотации или статически с файлом привязки xml.
Спасибо!
Ответы
Ответ 1
Это не совсем то, что вы ищете, но оно бьет, аннотируя каждое поле Даты отдельно. Вы можете установить XmlJavaTypeAdapter на уровне пакета, чтобы каждая ссылка на Date в вашем пакете использовала его. Если ваши объекты находятся в пакете com.example, вы должны добавить к нему файл package-info.java со следующим содержимым:
@XmlJavaTypeAdapter(value=MyCustomDateAdapter.class,type=Date.class)
package com.example;
Ответ 2
Попробуйте следующее:
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>
Ответ 3
После поиска всей документации jaxb и многих учебных пособий я не нашел ответа, который может настроить даты, кроме того, что мы жестко кодируем в XMLAdapter.
Я поместил файл свойств в classpath с форматами даты, например:
DateFormat = мм-дд-гггг
Теперь ваша реализация 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 также для загрузки файла свойств. Над кодом будет соответствующим образом настроена ваша дата.