XmlAdapter с настраиваемыми именами элементов - PullRequest
0 голосов
/ 21 сентября 2018

Я написал 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, но я не нахожу это ... спасибо за любую помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...