Я написал XmlAdapter
для класса с именем MultiValuedProperties
, который по сути является <String, List<String>>
с ключами без учета регистра.При включении этого XmlAdapter
в различные объекты JAXB элементы ключ / значение иногда упоминаются как «атрибут» вместо «свойство».Какой самый простой способ разрешить объекту, имеющему этот класс в качестве поля, указывать, как называются его элементы?
public class MultiValuedPropertiesJAXBAdapter extends XmlAdapter<MultiValuedPropertiesJAXBAdapter.MVPType, MultiValuedProperties> {
public static class MVPType {
@XmlElement(name="property")
List<MVPTypeEntry> entries = new ArrayList<>();
public boolean add(String key, String value) {
MVPTypeEntry entry = new MVPTypeEntry(key, value);
return entries.add(entry);
}
}
@AllArgsConstructor
public static class MVPTypeEntry {
@XmlAttribute
String key = null;
@XmlValue
String value = null;
}
@Override
public MultiValuedProperties unmarshal(MultiValuedPropertiesJAXBAdapter.MVPType type) throws Exception {
if (type == null)
return null;
MultiValuedProperties props = new MultiValuedProperties();
type.entries.forEach((entry) -> props.add(entry.key, entry.value));
return props;
}
@Override
public MultiValuedPropertiesJAXBAdapter.MVPType marshal(MultiValuedProperties mvp) throws Exception {
if (mvp == null)
return null;
MVPType type = new MVPType();
mvp.forEach((key, values) -> {
if (values != null)
values.forEach((value) -> type.add(key, value));
});
return type;
}
}
Пример использования:
public class Foo {
@XmlElement
@XmlJavaTypeAdapter(MultiValuedPropertiesJAXBAdapter.class)
public MultiValuedProperties getAttributes();
}
Что я хочу здесьis:
<foo>
<attributes>
<attribute key"somekey1">somevalue1</attribute>
<attribute key"somekey2">somevalue2</attribute>
</attributes>
</foo>
Таким образом, самые внутренние элементы называются «атрибут» вместо «свойство» для этого конкретного класса Foo.Я надеюсь, что есть простой способ сделать это в аннотациях JAXB, но я не нахожу это ... спасибо за любую помощь!