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

3
有没有一种使用JAXB的方法,将单个属性解组/拆分成多个字段?
我的XML文件中有一个元素,其中包含时间属性(无法更改XML文件)。 时间属性的精度为微秒。 因此,我无法将该属性存储在Java Date或Joda DateTime字段中。
我想将属性存储在一个简单的自定义DateTime类中,其中子秒存储在Integer中,其余部分存储在Java Date中(我无法访问Joda)。 但是,我无法弄清楚如何将单个属性解组到日期和整数中。
XML示例:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <root>
        <Range start="2001-01-01 01:23:45.012345"/>
    </root>

一个简单的自定义 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;
    }
}

最终解决方案

根据@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);
    }
}

更新自定义的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...
}

我选择在自定义DateTime类的构造函数中进行字符串翻译,而不是在XmlAdapter中进行,这样我就可以在除了仅仅取消编组之外的其他领域中使用DateTime
适配器的引用如下:
    @XmlAttribute(name = "start")
    @XmlJavaTypeAdapter(DateTimeAdapter.class)
    private DateTime range;
2个回答

5
你可以利用一个XmlAdapter。你的XmlAdapter将负责将你的DateTime实例转换为String,并从String转换回DateTime
public class DateTimeAdapter extends XmlAdapter<String, DateTime> {
    ...
}

然后您需要使用@XmlJavaTypeAdapter注解来引用XmlAdapter,并将其应用于类型为DateTime的属性。

@XmlJavaTypeAdapter(DateTimeAdapter.class)
public DateTime getFoo() {
    return foo;
}

感谢您指引我使用XmlAdapter。我将我的最终详细解决方案添加到了上面问题的底部。 - TryThis

0
String[] dt=start.split(".");
String timeStr=dt[0];
String subsStr=dt.length>1?dt[1]:null;

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