Установка типа xs:datetime из метода установки java пропускает миллисекундную часть значения метки времени

У меня есть объекты схемы java, созданные из схемы xsd с использованием JAXB.

То, что я пытаюсь сделать, это установить значения тегов xml с помощью методов установки объекта схемы java, а затем упорядочить объекты java. Однако в окончательном сгенерированном xml я вижу, что временная метка, сгенерированная для типов xs: datetime, не имеет миллисекунд.

Я ожидаю увидеть дату вроде "2013-06-28T01:20:50.000-04:00", а получаю только "2013-06-28T01:20:50". -04:00" без миллисекунд.

Вызов сеттера

obj.setTransactionDateTime(getTimestamp("2013-06-28 01:20:50"));

метод getTimestamp

public Calendar getTimestamp(String dateStr)
{
    Date returnDate = null;

    if(dateStr == null)
    {
        return null;
    }       

    try
    {
        SimpleDateFormat srcFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");            
        Date date = srcFormatter.parse(dateStr);        

        SimpleDateFormat destFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");    
        returnDate = destFormatter.parse(destFormatter.format(date));           
    }
    catch (ParseException e)
    {
        dbacc.logError("Error while parsing date string" + e.getMessage());
    }       

    Calendar cal = Calendar.getInstance();
    cal.setTime(returnDate);

    return cal;
}

Привязка для типов datetime определяется следующим образом...

<jxb:javaType name="java.util.Calendar" xmlType="xsd:dateTime" parseMethod="javax.xml.bind.DatatypeConverter.parseDateTime" printMethod="javax.xml.bind.DatatypeConverter.printDateTime"/>

Не уверен, что не так с кодом. Любая помощь очень ценится.


person Kiran    schedule 02.08.2013    source источник


Ответы (1)


Поведение по умолчанию

При маршаллинге java.util.Date реализация JAXB будет маршалировать их, если они не являются 0.

Модель Java (корень)

import java.util.Date;
import javax.xml.bind.annotation.*;

@XmlRootElement
@XmlType(propOrder = { "foo", "bar" })
public class Root {

    private Date foo;
    private Date bar;

    public Date getFoo() {
        return foo;
    }

    public void setFoo(Date foo) {
        this.foo = foo;
    }

    public Date getBar() {
        return bar;
    }

    public void setBar(Date bar) {
        this.bar = bar;
    }

}

Демо

import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Root.class);

        Root root = new Root();
        root.setFoo(DatatypeConverter.parseDateTime("2013-08-02T11:50:00-04:00").getTime());
        root.setBar(DatatypeConverter.parseDateTime("2013-08-02T11:50:00.123-04:00").getTime());

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(root, System.out);
    }

}

Вывод

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
    <foo>2013-08-02T11:50:00-04:00</foo>
    <bar>2013-08-02T11:50:00.123-04:00</bar>
</root>

Принуждение миллисекунд к упорядочению с помощью XmlAdapter

Вы можете создать XmlAdapter, чтобы контролировать способ вывода java.util.Date:

Использование XmlAdapter при запуске из XML-схемы

Ниже приведена ссылка на ответ, который я дал, демонстрирующий, как использовать XmlAdapter при создании модели из XML-схемы.

person bdoughan    schedule 02.08.2013
comment
На самом деле я понял, что сортировка выполняется только тогда, когда миллисекунды не равны 0, путем жесткого кодирования временной метки с ненулевым значением мс. Ваш ответ, однако, содержит более подробную информацию о том, как мы можем заставить его добавить ms независимо. Спасибо за объяснение и примеры. Это определенно помогает. - person Kiran; 02.08.2013