JAXB 拆分单个属性并绑定到多个字段

Try*_*his 3 java xml datetime jaxb

有没有办法使用 JAXB 将单个属性解组/拆分为多个字段?

我在具有时间属性的 XML 文件中有一个元素(无法更改 XML 文件)。时间属性的精度为微秒。因此,我无法将该属性存储在 java Date 或 Joda DateTime 字段中。

我想将属性存储在一个简单的自定义 DateTime 类中,其中亚秒存储在 Integer 中,其余部分存储在 java Date 中(我无权访问 Joda)。但是,我一直无法弄清楚如何将单个属性解组为 Date 和 Integer。

XML 示例:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <root>
        <Range start="2001-01-01 01:23:45.012345"/>
    </root>
Run Code Online (Sandbox Code Playgroud)

简单的自定义 DateTime 类:

public class DateTime {
    Date date;
    Integer subseconds;

    public Date getDate() {
        return this.date;
    }
    public void setDate(Date date) {
        this.date = date;
    }

    public Integer getSubseconds() {
        return this.subseconds;
    }
    public void setSubseconds(Integer subseconds) {
        this.subseconds = subseconds;
    }
}
Run Code Online (Sandbox Code Playgroud)

最终解决方案

按照@Blaise Doughan 的建议创建 DateTimeAdapter 类:

public class DateTimeAdapter extends XmlAdapter<String, DateTime> {
    @Override
    public String marshal (DateTime v) {
        return v.toString();
    }

    @Override
    public DateTime unmarshal (String v) {
        return new DateTime(v);
    }
}
Run Code Online (Sandbox Code Playgroud)

更新自定义DateTime类(添加构造函数并使其不可变):

public class DateTime {
    Date date = new Date();
    Integer subseconds = 0;

    public DateTime(String dateString) {
        if (dateString.matches("^\\d{4}-{\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}\\.\\d+") {
            try {
                this.date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(dateString.substring(0, 19));
            }
            catch (ParseException ex) {
                ex.printStackTrace();
            }

            this.subseconds = Integer.valueOf(dateString.substring(20));
        }
    }

    public Date getDate() {
        return this.date;
    }

    public Integer getSubseconds() {
        return this.subseconds;
    }

    ...additional methods...
}
Run Code Online (Sandbox Code Playgroud)

我选择在自定义DateTime类构造函数中进行字符串转换,而不是 ,XmlAdapter以便我可以DateTime在除解组之外的其他领域使用。

对适配器的引用如下:

    @XmlAttribute(name = "start")
    @XmlJavaTypeAdapter(DateTimeAdapter.class)
    private DateTime range;
Run Code Online (Sandbox Code Playgroud)

bdo*_*han 5

您可以利用XmlAdapter. 您XmlAdapter将负责将您的实例转换DateTime为/从String.

public class DateTimeAdapter extends XmlAdapter<String, DateTime> {
    ...
}
Run Code Online (Sandbox Code Playgroud)

然后,您将XmlAdapter使用@XmlJavaTypeAdaptertype 属性上的注释来引用DateTime

@XmlJavaTypeAdapter(DateTimeAdapter.class)
public DateTime getFoo() {
    return foo;
}
Run Code Online (Sandbox Code Playgroud)