2014-12-05 1 views
5

У меня есть компонент с типом данными:как отобразить java.time.Duration в XML

private java.time.Duration duration 

атрибут класса устанавливается так:

object.setDuration(Duration.ofSeconds(2)); 

Я хочу Маршалл моего объекта в XML, так что продолжительность выглядит так

<duration>PT2S</duration> 

как определено ISO 8601

Насколько я понимаю, JAXB использует default binding data types как:

xsd:duration javax.xml.datatype.Duration 

но в моем компоненте я не хочу, чтобы включить любые XML-зависимость.

Я вижу возможность писать обертку, где я могу добавить XmlAdapter, но я не знаю, как превратить java.time.Duration в javax.xml.datatype.Duration

ответ

6

Я узнал, с помощью функции поиска вокруг проверки API. Вот мой код:

import java.time.Duration 
import javax.xml.bind.annotation.adapters.XmlAdapter; 
import javax.xml.datatype.DatatypeFactory; 

public class DurationAdapter extends XmlAdapter<javax.xml.datatype.Duration, Duration> 
{ 
    @Override 
    public Duration unmarshal(javax.xml.datatype.Duration v) throws Exception { 
     return Duration.parse(v.toString()); 
    } 

    @Override 
    public javax.xml.datatype.Duration marshal(Duration v) throws Exception { 
     return DatatypeFactory.newInstance().newDuration(v.toString()); 
    } 
} 
1

Я нашел реализацию этих адаптеров на GitHub. В дополнение к Duration у него есть другие java.time.* типы, такие как Instant и Period.

Единственным недостатком является то, что маршаллинг использует строки вместо соответствующих javax.xml.datatype.*.

+0

Понятно, что у меня есть улучшенная версия: https://github.com/migesok/jaxb-java-time-adapters/blob/master/src/main/java/com/migesok/jaxb/adapter/ javatime/DurationXmlAdapter.java –