如何将java.time.Duration映射到XML

6

我有一个数据类型为 bean:

private java.time.Duration duration

class属性设置如下:

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

我想将我的对象编组为XML,以便持续时间看起来像这样。
<duration>PT2S</duration>

作为定义,ISO 8601 是指日期和时间的表示方法。

据我理解,Jaxb使用 默认绑定数据类型 ,例如:

xsd:duration    javax.xml.datatype.Duration

但是在我的bean中,我不想包含任何xml依赖。

我看到编写一个包装器的可能性,在其中可以添加XmlAdapter,但我不知道如何将java.time.Duration转换为javax.xml.datatype.Duration

2个回答

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
这个不行。Java Time Duration 不包含年份。java.time.format.DateTimeParseException: Text cannot be parsed to a Duration - mend
我也无法使用。javax.xml.datatype.Duration "P0Y0M0DT0H0M1S" 无法被 java.time.Duration 解析。我注意到 javax.xml.datatype.Duration.toString 会根据实现产生不同的输出,因此它可能适用于某些应用程序,但对于其他应用程序则不适用。 - kapex

1

我在GitHub上找到了这个适配器的实现。除了Duration之外,它还有其他java.time.*类型,如InstantPeriod

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


我看到了一个比我的更好的版本:https://github.com/migesok/jaxb-java-time-adapters/blob/master/src/main/java/com/migesok/jaxb/adapter/javatime/DurationXmlAdapter.java - Oscar Castiblanco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接