使用 jackson-dataformat-xml 库将 XML 中的空标签转换为 java 属性

Convert an empty tag in XML to java attribute using jackson-dataformat-xml library

我有以下 XML 需要在 Spring Boot 应用程序中转换为 POJO。为此,我正在使用 jackson-dataformat-xml 模块。

<Root>
    <Element1 ns="xxx">
        <Element2/>
    </Element1>
</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;
    }
}

元素 1 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;
    }
}

属性 Element1 中的 element2 始终设置为 false。如果存在 Element2 标签,有什么方法可以将其设置为 true 吗?否则 false?

默认情况下 Jackson 使用 com.fasterxml.jackson.databind.deser.BeanDeserializer class 将给定的 XML 元素反序列化为 POJO。仅当 XML 有效负载中存在相应节点时,此反序列化器才会调用 setter 方法。如果负载中不存在节点 - setter 方法不会被调用。我们可以利用这种行为。

因为我们要始终设置 true,所以我们应该创建新的私有 setter 方法并强制 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;
    }
}