[java] jaxb unmarshal timestamp



1 Answers

JAXB не может маршировать объекты Date напрямую, потому что у них недостаточно информации, чтобы быть однозначной. JAXB представила для этого класс XmlGregorianCalendar , но использовать его очень неприятно.

Я предлагаю изменить поле timestamp как XmlGregorianCalendar и изменить различные методы, чтобы обновить это поле, сохранив при этом общедоступный интерфейс, где это возможно.

Если вы хотите сохранить поле « Date , вам нужно будет реализовать свой собственный класс XmlAdapter чтобы сообщить JAXB, как превратить вашу Date в и из XML.

Question

Я не могу заставить JAXB отменять отметку времени в приложении JAX-RS для Resteasy.

Мой класс выглядит так:

@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;
        }
    }
}

Есть идеи?

Благодарю.




Использование этого адаптера должно быть безопасным потоком:

public class DateXmlAdapter extends XmlAdapter<String, Date> {

    /**
     * Thread safe {@link DateFormat}.
     */
    private static final ThreadLocal<DateFormat> DATE_FORMAT_TL = new ThreadLocal<DateFormat>() {

        @Override
        protected DateFormat initialValue() {
            return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
        }

    };

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

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

}



Related