Как указать формат даты, используемый при JAXB marshals xsd: dateTime?
когда JAXB маршалирует объект даты (XMLGregorianCalendar
) в элемент xsd: dateTime как вы можете указать формат результирующего XML?
например:
Формат данных по умолчанию использует миллисекунды <StartDate>2012-08-21T13:21:58.000Z</StartDate>
Мне нужно опустить миллисекунды. <StartDate>2012-08-21T13:21:58Z</StartDate>
как я могу указать форму вывода / формат даты, который я хочу использовать?
Я использую javax.xml.datatype.DatatypeFactory
создать
3 ответа:
можно использовать
XmlAdapter
чтобы настроить способ записи типа даты в XML.import java.text.SimpleDateFormat; import java.util.Date; import javax.xml.bind.annotation.adapters.XmlAdapter; public class DateAdapter extends XmlAdapter<String, Date> { private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); @Override public String marshal(Date v) throws Exception { synchronized (dateFormat) { return dateFormat.format(v); } } @Override public Date unmarshal(String v) throws Exception { synchronized (dateFormat) { return dateFormat.parse(v); } } }
тогда вы используете
@XmlJavaTypeAdapter
аннотации указано, чтоXmlAdapter
должны использоваться для конкретного поля/свойства.@XmlElement(name = "timestamp", required = true) @XmlJavaTypeAdapter(DateAdapter.class) protected Date timestamp;
С помощью файла привязки xjb:
<jxb:javaType name="java.time.ZonedDateTime" xmlType="xs:dateTime" parseMethod="my.package.DateAdapter.parseDateTime" printMethod="my.package.DateAdapter.formatDateTime" />
будет производить упомянутой выше аннотации.
Я использую SimpleDateFormat для создания XMLGregorianCalendar, например, в этом примере:
public static XMLGregorianCalendar getXmlDate(Date date) throws DatatypeConfigurationException { return DatatypeFactory.newInstance().newXMLGregorianCalendar(new SimpleDateFormat("yyyy-MM-dd").format(date)); } public static XMLGregorianCalendar getXmlDateTime(Date date) throws DatatypeConfigurationException { return DatatypeFactory.newInstance().newXMLGregorianCalendar(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(date)); }
первый метод создает экземпляр XMLGregorianCalendar, который форматируется XML-маршаллером как допустимый xsd:date, второй метод приводит к допустимому xsd: dateTime.
очень простой способ для меня. XMLGregorianCalendar форматирование для того, чтобы упорядочить в Java.
Я просто создаю свои данные в хорошем формате. Элемент
toString
будет называться получение хорошего результата.public static final XMLGregorianCalendar getDate(Date d) { try { return DatatypeFactory.newInstance().newXMLGregorianCalendar(new SimpleDateFormat("yyyy-MM-dd").format(d)); } catch (DatatypeConfigurationException e) { return null; } }