使用 JAXB 将多个 XML 元素解组到一个字段

Unmarshalling multiple XML elements to one field using JAXB

我有一个 XML 文件,格式如下。我目前正在使用 JAXB 将 XML 元素 (event) 解组为 Java 对象 (Event)。所有属性都工作正常,除了一个...
正如您在 XML 中看到的,date 元素仅存储 日期,而 time 仅存储 [=43] =] 事件发生的时间。我想将这两个 XML 元素组合成一个名为 timeLocalDataTime 字段,并使用适当的 getter 和 setter。

XML:

...
<event>
    ...
    <date>2014-02-19</date>
    <time>2000-01-01T14:17:00Z</time>
    ...
</event>
...

需要Java对象:

public class Event {
    ...
    // Returns a combination of the date and time stored in the XML
    public LocalDateTime getDateTime() {
        return dateTime;
    }
    ...
}

我的第一个想法是使用 XMLAdapter,但似乎这只允许我将 1 个 XML 元素映射到 1 个 Java 对象。

之后,我尝试通过覆盖设置器 setTimesetDate 来实现它。这些设置器每个都会更改存储时间的时间或日期。但我无法让它工作,而且它似乎也是一种非常丑陋的方式来做到这一点。

我已经阅读了以下内容JAXB convert multiple attributes to one type while unmarshalling。但是对于这个项目,我宁愿不使用像 MOXy 这样的外部库。

有谁知道如何以 干净 的方式仅使用 JAXB 来做到这一点?

您可以在事件对象生命周期方法中定义:

void afterUnmarshal(Unmarshaller unm, Object parent) {
    localDateTime = ....
};
boolean beforeMarshal(Marshaller mar) {  
    date = localDateTime.toDate();
    ....
};

在解组后(使用日期和时间值)构造 LocalDateTime 属性,并在使用当前 LocaLDateTime 值编组之前准备 date/time 字段。 您仍然需要 time/date 字段来匹配 xml 并且 localDateTime 字段必须是 XmlTransient。所以它与 set/getter 方法没有太大区别,但可能更 "clean"。