使用适配器使用MOXy或任何其他JAXB实现将类封送到根元素 [英] Using an adapter to marshal a class to a root element with MOXy or any other JAXB implementation
问题描述
我有一个从Apache Commons Configuration扩展CompositeConfiguration类的类。我正在尝试使用MOXy将其编组为XML。我已经创建了一个XML适配器,可以将配置转换为简单名称/值对象列表。
I have a class which extends the CompositeConfiguration class from Apache Commons Configuration. I am trying to marshal it to XML using MOXy. I have created an XML adapter that converts the configuration to a list of simple name/value objects.
我尝试过对下面的内容进行多种修改但是仍然受阻。我可以在创建JAXB上下文时看到我的适配器类被加载和实例化,但是当我编组配置对象时它永远不会被调用。
I have tried using a number of variations on what I have below but am still stymied. I can see my adapter class being loaded and instantiated when I create the JAXB context but it is never called when I marshal the configuration object.
查看MOXy源代码,我开始怀疑不可能为也是根元素的Java类指定XML适配器。我是否正确地开始工作还是有完全不同的方法吗?
Looking at the MOXy source code, I am beginning to suspect that it is impossible to specify an XML adapter for a Java class that is also a root element. Am I on the right track to getting this working or is there a completely different way to do this?
XML适配器:
public class JAXBConfigurationAdapter extends XmlAdapter<Object, BetterBaseConfiguration>
{
@Override
public Object marshal(final BetterBaseConfiguration javaObject) throws Exception
{
List<ConfigurationPropertyXmlType> jaxbConfiguration = new ArrayList<>();
Iterator<String> keys = javaObject.getKeys();
while (keys.hasNext())
{
String key = keys.next();
ConfigurationPropertyXmlType property = new ConfigurationPropertyXmlType();
property.setKey(key);
property.setValue(javaObject.getString(key));
jaxbConfiguration.add(property);
}
return jaxbConfiguration;
}
@Override
public CompositeConfiguration unmarshal(final Object jaxbObject) throws Exception
{
BetterBaseConfiguration configuration = new BetterBaseConfiguration();
for (ConfigurationPropertyXmlType property : (List<ConfigurationPropertyXmlType>) jaxbObject)
{
configuration.setProperty(property.getKey(), property.getValue());
}
return configuration;
}
}
名称/价值类:
public class ConfigurationPropertyXmlType
{
private String key;
private String value;
public String getKey()
{
return key;
}
public String getValue()
{
return value;
}
public void setKey(final String key)
{
this.key = key;
}
public void setValue(final String value)
{
this.value = value;
}
}
EclipseLink映射文件:
EclipseLink mapping file:
<?xml version="1.0" encoding="UTF-8"?>
<xml-bindings version="2.5" xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="
http://www.eclipse.org/eclipselink/xsds/persistence/oxm http://www.eclipse.org/eclipselink/xsds/eclipselink_oxm_2_5.xsd"
package-name="myapp.configuration">
<xml-schema element-form-default="QUALIFIED">
<xml-ns prefix="mynm" namespace-uri="http://mynamespace" />
</xml-schema>
<java-types>
<java-type name="myapp.configuration.BetterBaseConfiguration" >
<xml-java-type-adapter value="myapp.configuration.JAXBConfigurationAdapter" type="myapp.configuration.BetterBaseConfiguration" />
<xml-root-element name="Configuration" />
</java-type>
</java-types>
</xml-bindings>
所需产出:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property>
<name>some name</name>
<value>some value</value>
</property>
</configuration>
推荐答案
EclipseLink MOXy 和其他 JAXB(JSR-222) 提供程序不会将 XmlAdapter
应用于根对象被编组。您可以在执行编组之前或执行unmarshal之后显式调用适配器逻辑。
EclipseLink MOXy and other JAXB (JSR-222) providers do not apply an XmlAdapter
to the root object being marshalled. You can explicitly call the adapter logic before doing a marshal or after doing an unmarshal.
这篇关于使用适配器使用MOXy或任何其他JAXB实现将类封送到根元素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!