java - 防止写入默认属性值 JAXB

标签 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;
}

根据 JAXB Avoid saving default values 我知道如果我不想写字符串,我可以修改 getter/setter 以写入 null 并在读取 null 时读取默认值。

但是,对于 int 我不确定该怎么做,因为它的值将始终为 0,除非它被特别更改。

有更好的方法吗?我可以将内部数据类型更改为 String,然后在需要时转换它,但这有点困惑。

最佳答案

您可以通过将字段更改为对象类型(默认空值不会出现在 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;
    }
}

允许取消设置属性

如果要允许设置操作将属性返回到其默认状态,则需要在设置方法中添加逻辑。

public void setNumber(int number) {
    if(0 == number) {
        this.number = null;
    } else {
        this.number = number;
    }
 }

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

public void unsetNumber() {
    this.number = null;
}

允许一个集合为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;
    }

更新

Blaise, don't you think that the solution is pretty verbose?

I mean that such use case should be probably supported by framework. For example using annotation like @DefaultValue.

如今 JAXB 如何支持默认值

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

真正要求的是什么

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

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

人们今天在做什么?

通常对于这种用例,人们只需将 int 属性更改为 Integer 并将 null 设为默认值。我以前从未遇到过有人要求对 String 执行此操作。

关于java - 防止写入默认属性值 JAXB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28340772/

相关文章:

JAXB javax.xml.bind.PropertyException

java - 哪些 JCE 提供商符合 FIPS 140-2?

java - Spring Web应用程序注释驱动 - 如何配置? (最佳实践)

java - Vaadin:垂直表

java - 使用 struts2 将枚举映射为表单元素

java - Spring + JAXB 集成 : Class has two properties of the same name

java - ByteBuffer 的 DataOutputStream.readBoolean 和 DataOutputStream.writeBoolean 等效吗?

java - FindBugs OBL_UNSATISFIED_OBLIGATION

java - 无法使用 JAXB 编码 XBRL 实例

java - 如何从通用 JAXBElement<?延伸 >