Я не могу заставить JAXB не упорядочивать метку времени в серверном приложении Resteasy JAX-RS.
Мой класс похож на это:
@XmlAccessorType(XmlAccessType.NONE)
@XmlRootElement(name = "foo")
public final class Foo {
// Other fields omitted
@XmlElement(name = "timestamp", required = true)
protected Date timestamp;
public Foo() {}
public Date getTimestamp() {
return timestamp;
}
public String getTimestampAsString() {
return (timestamp != null) ? new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(timestamp) : null;
}
public void setTimestamp(final Date timestamp) {
this.timestamp = timestamp;
}
public void setTimestamp(final String timestampAsString) {
try {
this.timestamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(timestampAsString);
} catch (ParseException ex) {
this.timestamp = null;
}
}
}
Какие-либо идеи?
Спасибо.
JAXB может обрабатывать класс java.util.Date. Однако он ожидает формат:
«гггг-ММ-дд'T'ЧЧ: мм: сс» вместо «гггг-ММ-дд ЧЧ: мм: сс»
Если вы хотите использовать этот формат даты, я предложил бы использовать XmlAdapter, это будет выглядеть примерно так:
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class DateAdapter extends XmlAdapter<String, Date> {
private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Override
public String marshal(Date v) throws Exception {
return dateFormat.format(v);
}
@Override
public Date unmarshal(String v) throws Exception {
return dateFormat.parse(v);
}
}
Затем вы должны указать этот адаптер в свойстве отметки времени:
import java.util.Date;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@XmlAccessorType(XmlAccessType.NONE)
@XmlRootElement(name = "foo")
public final class Foo {
// Other fields omitted
@XmlElement(name = "timestamp", required = true)
@XmlJavaTypeAdapter(DateAdapter.class)
protected Date timestamp;
public Foo() {}
public Date getTimestamp() {
return timestamp;
}
public void setTimestamp(final Date timestamp) {
this.timestamp = timestamp;
}
}
JAXB не может маршалировать объекты Date
напрямую, потому что у них недостаточно информации, чтобы быть однозначным. JAXB представил для этой цели класс XmlGregorianCalendar
, но его очень неприятно использовать напрямую.
Предлагаю изменить поле отметки времени
на XmlGregorianCalendar
, а также изменить различные методы для обновления этого поля, сохранив, по возможности, общедоступный интерфейс, который у вас уже есть.
Если вы хотите сохранить поле Date
, вам необходимо реализовать собственный класс XmlAdapter
, чтобы сообщить JAXB, как преобразовать вашу Date
в и из XML.