我想使用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内置类型生成类型信息。为什么呢?
顺便说一句,如果我想将适配器用于double
和Double
,我必须设置
@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.]
使用包级别注释按预期工作。
答案 0 :(得分:0)
您可以在EclipseLink MOXy或任何JAXB(JSR-222)实现中注册XmlAdapter
的最大范围是包级别。
了解更多信息
您可以在我的博客上阅读有关JAXB和程序包级别适配器的更多信息: