2014-12-05 130 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.*类型,如InstantPeriod

唯一的缺点是编组使用字符串,而不是相应的javax.xml.datatype.*

+0

我明白了,我的改进版本是:https://github.com/migesok/jaxb-java-time-adapters/blob/master/src/main/java/com/migesok/jaxb/adapter/ javatime/DurationXmlAdapter.java – 2016-01-25 13:21:26