gpt4 book ai didi

java - 如何告诉 EclipseLink 在全局范围内对某种类型使用 XmlAdapter?

转载 作者:行者123 更新时间:2023-12-02 05:02:18 25 4
gpt4 key购买 nike

我想使用 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 绑定(bind)文件中引用像 double 这样的基本类型呢?

更新2

将包级别的绑定(bind)指定为 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 和包级适配器的更多信息:

关于java - 如何告诉 EclipseLink 在全局范围内对某种类型使用 XmlAdapter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23575200/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com