2014-12-05 9 views
5

Ho un fagiolo con il tipo di dati:come mappare java.time.Duration a XML

private java.time.Duration duration 

l'attributo di classe è impostato così:

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

voglio marshall mio oggetto di XML in modo che la durata sembra che

<duration>PT2S</duration> 

come definito ISO 8601

Per quanto ho capito, JAXB utilizza default binding data types come:

xsd:duration javax.xml.datatype.Duration 

ma nella mia fagioli non voglio includere qualsiasi dipendenza xml.

vedo la possibilità di scrivere un wrapper dove posso aggiungere una XmlAdapter, ma non so come trasformare java.time.Duration a javax.xml.datatype.Duration

risposta

6

ho scoperto con la ricerca intorno al controllo delle API. Ecco il mio codice:

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

Ho trovato un'implementazione di questi adattatori su GitHub. Oltre a Duration, ha gli altri tipi java.time.* come Instant e Period.

L'unico svantaggio è che il marshalling utilizza le stringhe anziché il corrispondente javax.xml.datatype.*.

+0

Vedo, c'è una mia versione migliorata: https://github.com/migesok/jaxb-java-time-adapters/blob/master/src/main/java/com/migesok/jaxb/adapter/ javatime/DurationXmlAdapter.java –