JAXB使用MOXy - 如何覆盖属性序列化行为?

时间:2013-05-22 10:48:43

标签: jaxb moxy

我有两个班级

    class First{
      private Date date;

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

class Second extends First{
    @XmlAttribute
    @XmlJavaTypeAdapter(value = DateAdapter.class, type = Date.class)
    public Date getDate() {
        return super.getDate();
    }
}

DateAdapter只将日期翻译为Long和back 我正在序列化第二个类的实例,似乎是忽略了DateAdapter。我的意思是我得到字符串“2013-05-22T13:32:40.664”而不是它的长表示。

如果我将@XmlJavaTypeAdapter注释移动到First类,它可以正常工作,但我的问题是First无法修改,这基本上是我创建包装类的原因。

如何识别XmlJavaTypeAdapter?

1 个答案:

答案 0 :(得分:1)

您可以使用EclipseLink JAXB (MOXy)的外部绑定文件为无法修改的类提供元数据:

<强> oxm.xml

<?xml version="1.0"?>
<xml-bindings
    xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
    package-name="com.example.foo">
    <java-types>
        <java-type name="First">
            <java-attributes>
                <xml-element java-attribute="date">
                    <xml-java-type-adapter value="com.example.foo.DateAdapter"/>
                </xml-element>
            </java-attributes>
        </java-type>
    </java-types>
</xml-bindings>

<强>演示

然后,您可以使用指定元数据位置的属性来引导您的JAXBContext

import java.util.*;
import javax.xml.bind.JAXBContext;

import org.eclipse.persistence.jaxb.JAXBContextProperties;

public class Demo {

    public static void main(String[] args) throws Exception {
        Map<String, Object> properties = new HashMap<String, Object>();
        properties.put(JAXBContextProperties.OXM_METADATA_SOURCE, "com/example/foo/oxm.xml");
        JAXBContext jc = JAXBContext.newInstance(new Class[] {First.class, Second.class}, properties);
    }

}

了解更多信息