jaxb не упорядочивают метку времени

Я не могу заставить 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;
        }
    }
}

Какие-либо идеи?

Спасибо.

60
задан skaffman 25 March 2010 в 21:16
поделиться

2 ответа

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

}
108
ответ дан 24 November 2019 в 17:42
поделиться

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

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

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

11
ответ дан 24 November 2019 в 17:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: