用户扩展Date对象的JAXB编组总是导致空XML

时间:2014-05-07 17:48:49

标签: jaxb

我有一个有很多字段的类,其中一些是日期。具体来说,它们是MyDate对象,我的MyDate类扩展了java.util.Date。

当我封送我的顶级类时,日期字段显示在生成的XML中,但没有内容。顺便说一下,我已经验证了我的顶级对象中的字段不为空,它们确实引用了合法的MyDate对象。所以我得到的XML看起来像是 <TopLevelObject> <address>1234</address> <startDate></startDate> <endDate></endDate> . . . </TopLevelObject>

我尝试注释MyDate类,以便我可以编组一个MyDate对象,并得到基本相同的结果:
<MyDate></MyDate>
我已经确认我正在编组的对象存在且包含合理的日期。

是否存在关于编组派生类的对象的一些我不明白的事情?

我尝试在java命令行上启用Jaxb调试(通过添加-Djaxb.debug = true)。这会导致一些输出,但我认为没有任何帮助。

编辑:在Blaise回应之前,我尝试添加
@XmlSchemaType(name = "date")
就在我的模型类中声明每个MyDate属性之前。这似乎导致编组代码在创建XML时中途崩溃。生成的XML只是在中间停止;没有任何迹象表明抛出异常或堆栈跟踪或类似的东西。

1 个答案:

答案 0 :(得分:1)

作为MyDate的扩展名的您的类java.util.Date被JAXB视为模型类而不是Date类。因此,它只会封送公​​共字段和属性,或JAXB带注释的字段/属性。如果您希望将其视为java.util.Date,则可以为其创建XmlAdapter

import java.util.Date;
import javax.xml.bind.annotation.adapters.XmlAdapter;

public class MyDateAdapter extends XmlAdapter<Date, MyDate> {

    @Override
    public MyDate unmarshal(Date date) throws Exception {
        // TODO Add logic to convert Date to MyDate
        throw new UnsupportedOperationException();
    }

    @Override
    public Date marshal(MyDate myDate) throws Exception {
        return myDate;
    }

}

要始终将此XmlAdapter应用于您的MyDate课程,您可以使用MyDate注释对@XmlJavaTypeAdapter进行注释:

import java.util.Date;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

@XmlJavaTypeAdapter(MyDateAdapter.class)
public class MyDate extends Date {

}

更新

  

什么是控制一个类是否被视为模型而不是   是什么内容被包括在编组中?

大多数情况下,不在标准Java SE包中的类将被视为域对象。

  

另外,当我创建XmlAdapter类时,我是否只是将它删除   在我的源目录中的MyDate.java旁边,或者我是否需要创建一个   在其他地方引用它?

XmlAdapter是从@XmlJavaTypeAdapter注释引用的。