Преобразуйте пустой тег в атрибуте XML в java с помощью библиотеки jackson-dataformat- xml - PullRequest
4 голосов
/ 05 августа 2020

У меня ниже XML, который нужно преобразовать в POJO в приложении Spring Boot. Я использую для этого модуль jackson-dataformat-xml.

<Root>
    <Element1 ns="xxx">
        <Element2/>
    </Element1>
</Root>

Root Pojo:

@JacksonXmlRootElement(localName = "Root")
public class Root {
    @JacksonXmlProperty(localName = "Element1")
    private Element1 element1;

    public String getElement1() {
        return element1;
    }

    public void setElement1(String element1) {
        this.element1 = element1;
    }
}

Element1 Pojo:

public class Element1 {
    @JacksonXmlProperty(isAttribute = true)
    private String ns;
    
    @JacksonXmlProperty(localName = "Element2")
    private boolean element2;

    public boolean getElement2() {
        return element2;
    }

    public void setElement2(boolean element2) {
        this.element2 = element2;
    }
}

Свойство element2 в Element1 всегда имеет значение false. Есть ли способ установить его на true, если присутствует тег Element2 ; в противном случае false?

1 Ответ

1 голос
/ 05 августа 2020

По умолчанию Jackson использует класс com.fasterxml.jackson.databind.deser.BeanDeserializer для десериализации данного элемента XML в POJO. Этот десериализатор вызывает метод setter, только если соответствующий узел существует в полезных данных XML. В случае, если узел не существует в полезной нагрузке - метод setter не вызывается. Мы можем использовать это поведение.

Поскольку мы хотим всегда устанавливать true, мы должны создать новый частный метод установки и заставить Jackson использовать его с аннотацией @JacksonXmlProperty. Ниже вы можете увидеть пример:

class Element1 {
    @JacksonXmlProperty(isAttribute = true)
    private String ns;

    private boolean element2;

    public boolean getElement2() {
        return element2;
    }

    public void setElement2(boolean element2) {
        this.element2 = element2;
    }

    @JacksonXmlProperty(localName = "Element2")
    private void setElement2ByJackson(boolean ignored) {
        this.element2 = true;
    }
}
...