如何告诉EclipseLink全局使用某个类型的XmlAdapter?

时间:2014-05-09 23:00:16

标签: java jaxb eclipselink

我想使用EclipseLink MOXy将对象树持久化为XML。但我希望使用自定义double编写DoubleAdapter类型的所有字段。我知道我可以使用像

这样的基于包的注释来做到这一点
@XmlJavaTypeAdapters({ @XmlJavaTypeAdapter(type = double.class, value = DoubleAdapter.class) })
package example; 

问题是,我必须将它添加到每个包中,这看起来非常愚蠢。

我甚至尝试使用bindings.xml文件,但同样仅限于一个软件包。

有没有办法配置JAXBContext,以便在遇到DoubleAdapter类型的对象时始终使用double

更新

我尝试使用以下bindings.xml

<?xml version="1.0"?>
<xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm" package-name="java.lang">
    <java-types>
        <java-type name="Double">
            <xml-java-type-adapter value="moxy.DoubleAdapter" />
            <java-attributes />
        </java-type>
    </java-types>
</xml-bindings>

但是,然后创建JaxbContext会导致NullPointerException。为什么呢?

Map<String, Object> props = new HashMap<>();
props.put(JAXBContextProperties.OXM_METADATA_SOURCE, "bindings.xml");
JAXBContext jaxbContext = JAXBContext.newInstance(new Class[] { Foo.class }, props);

通过XML元数据在类级别添加全局XmlAdapter,这种方式适用于我自己的类,但它在某种程度上不适用于Double

好的,我在整个过程中进行了调试,发现XMLToJavaTypeMap中列出了java.lang.Double。这会导致typeInfoMap不包含TypeInfo,从而导致org.eclipse.persistence.jaxb.compiler.XMLProcessor.processXML()中的NPE。因此,不为Java内置类型生成类型信息。为什么呢?

顺便说一句,如果我想将适配器用于doubleDouble,我必须设置

@XmlJavaTypeAdapters({ 
    @XmlJavaTypeAdapter(type = double.class, value = DoubleAdapter.class),
    @XmlJavaTypeAdapter(type = Double.class, value = DoubleAdapter.class) 
})
package example; 

但是如何在XML绑定文件中引用像double这样的原始类型?

更新2

在包级别上将绑定指定为XML(请注意基元double

<?xml version="1.0"?>
<xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm" package-name="foo">
   <xml-java-type-adapters>
      <xml-java-type-adapter value="foo.DoubleAdapter" type="double"/>
      <xml-java-type-adapter value="foo.DoubleAdapter" type="java.lang.Double"/>
   </xml-java-type-adapters>
</xml-bindings>

结果

Exception in thread "main" javax.xml.bind.JAXBException: Provider org.eclipse.persistence.jaxb.JAXBContextFactory could not be instantiated: javax.xml.bind.JAXB
Exception: 
Exception Description: An invalid XmlJavaTypeAdapter [foo.DoubleAdapter] was specified for package [foo]. Possible causes are an incorrect adapter class name or
 the wrong loader has been set.
 - with linked exception:
[Exception [EclipseLink-50065] (Eclipse Persistence Services - 2.5.1.v20130918-f2b9fc5): org.eclipse.persistence.exceptions.JAXBException
Exception Description: An invalid XmlJavaTypeAdapter [foo.DoubleAdapter] was specified for package [foo]. Possible causes are an incorrect adapter class name or
 the wrong loader has been set.]

使用包级别注释按预期工作。

1 个答案:

答案 0 :(得分:0)

您可以在EclipseLink MOXy或任何JAXB(JSR-222)实现中注册XmlAdapter的最大范围是包级别。

了解更多信息

您可以在我的博客上阅读有关JAXB和程序包级别适配器的更多信息: