防止编写默认属性值JAXB

Was*_*ssa 5 java jaxb

我正在尝试编写该类,以便在JAXB中编写具有属性的元素.在这个XML中,有一些默认值,无论它们是字符串,整数还是自定义类类型.

以下减少的例子:

@XmlAccessorType(XmlAccessType.NONE)
@XmlRootElement(name = "FIELD")
public class TestLayoutNode
{
    // I want to not write this to the xml when it is 0
    @XmlAttribute(name = "num")
    private int number;

    // I want to not write this when it is "default"
    @XmlAttribute(name = "str")
    private String str;
}
Run Code Online (Sandbox Code Playgroud)

根据JAXB避免保存默认值 我知道如果我不想写String我可以修改getters/setters来写null并读取默认值,如果它读为null.

但是,使用int我不知道该怎么做,因为它总是具有值0,除非它被特别更改.

有没有更好的方法来做到这一点?我可以将内部数据类型更改为String,然后在需要时将其强制转换,但这有点混乱.

bdo*_*han 3

您可以通过将字段更改为对象类型(默认情况下空值不会出现在 XML 表示中)并将一些逻辑放入 getter 中来执行以下操作:

@XmlAccessorType(XmlAccessType.NONE)
@XmlRootElement(name = "FIELD")
public class TestLayoutNode
{

    @XmlAttribute(name = "num")
    private Integer number;

    @XmlAttribute
    private String str;

    public int getNumber() {
        if(null == number) {
           return 0;
        } else {
           return number;
        }
    }

    public void setNumber(int number) {
        this.number = number;
    }

    public String getStr() {
        if(null == str) {
            return "default";
        } else {
            return str;
        }
    }

    public void setStr(String str) {
        this.str = str;
    }
}
Run Code Online (Sandbox Code Playgroud)

允许取消设置属性

如果您希望允许 set 操作将属性返回到其默认状态,那么您需要在 set 方法中添加逻辑。

public void setNumber(int number) {
    if(0 == number) {
        this.number = null;
    } else {
        this.number = number;
    }
 }
Run Code Online (Sandbox Code Playgroud)

或者你可以提供一个未设置的方法:

public void unsetNumber() {
    this.number = null;
}
Run Code Online (Sandbox Code Playgroud)

允许集合null

如果您希望允许str设置该属性,null以便 get 方法返回null而不返回"default",那么您可以维护一个标志来跟踪它是否已设置:

    private strSet = false;

    public String getStr() {
        if(null == str && !strSet) {
            return "default";
        } else {
            return str;
        }
    }

    public void setStr(String str) {
        this.str = str;
        this.strSet = true;
    }
Run Code Online (Sandbox Code Playgroud)

更新

Blaise,你不觉得这个解决方案相当冗长吗?

是的

我的意思是这样的用例可能应该得到框架的支持。例如使用 @DefaultValue 之类的注释。

目前 JAXB 如何支持默认值

如果 XML 中缺少节点,则不会对 Java 对象中的相应字段/属性执行设置。这意味着您将属性初始化为的任何值仍然存在。在编组上,由于值已填充,因此它将被编组出来。

真正的要求是什么

真正要求的是当字​​段/属性具有默认值时不要对其进行封送。通过这种方式,您希望 null 值和默认值的编组行为相同。这就引入了一些需要解决的问题:

  1. 现在如何将 null 编组到 XML?默认情况下它仍然被编组为丢失节点吗?
  2. 是否需要提供一种机制来区分属性是默认值(不存在于 XML 中)和已设置为与默认值相同的值(存在于 XML 中)?

人们今天在做什么?

一般来说,对于这种用例,人们只需将int属性更改为默认值Integer即可。null我以前从未遇到过有人要求这种行为String