繁体   English   中英

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

[英]How to tell EclipseLink to use an XmlAdapter for a certain type globally?

我想使用EclipseLink MOXy将对象树持久化为XML。 但我希望使用自定义DoubleAdapter编写double类型的所有字段。 我知道我可以用基于包的注释来做到这一点

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

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

我甚至尝试使用bindings.xml文件,但它又限于一个包。

有没有办法配置JAXBContext,以便它遇到double类型的对象时总是使用DoubleAdapter

更新

我尝试使用以下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

好的,我在整个过程中进行了调试,发现java.lang.Double列在XMLToJavaTypeMap中。 这导致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.]

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

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

欲获得更多信息

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM