Использование адаптера для маршалинга класса в корневой элемент с помощью MOXy или любой другой реализации JAXB
У меня есть класс, который расширяет класс CompositeConfiguration из конфигурации Apache Commons. Я пытаюсь упорядочить его в XML с помощью MOXy. Я создал адаптер XML, который преобразует конфигурацию в список простых объектов имя / значение.
Я попытался использовать несколько вариантов того, что у меня есть ниже, но все еще в тупике. Я вижу, что мой класс адаптера загружается и создается при создании контекста JAXB, но он никогда не вызывается, когда я собираю объект конфигурации.
Глядя на исходный код MOXy, я начинаю подозревать, что невозможно указать адаптер XML для класса Java, который также является корневым элементом. Я на правильном пути, чтобы заставить это работать или есть совершенно другой способ сделать это?
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:
<?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>