我正在尝试编写类以便在 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 行为对于空值和默认值是相同的。这就引入了一些需要解决的问题:
- 您现在如何将 null 编码到 XML?默认情况下,它是否仍被编码为缺失节点?
- 是否需要提供一种机制来区分属性是默认值(不存在于 XML 中)和已设置为与默认值相同的值(存在于 XML 中)?
人们今天在做什么?
通常对于这种用例,人们只需将 int
属性更改为 Integer
并将 null
设为默认值。我以前从未遇到过有人要求对 String
执行此操作。
关于java - 防止写入默认属性值 JAXB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28340772/