我正在尝试编写该类,以便在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,然后在需要时将其强制转换,但这有点混乱.
您可以通过将字段更改为对象类型(默认情况下空值不会出现在 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 值和默认值的编组行为相同。这就引入了一些需要解决的问题:
人们今天在做什么?
一般来说,对于这种用例,人们只需将int属性更改为默认值Integer即可。null我以前从未遇到过有人要求这种行为String。
| 归档时间: |
|
| 查看次数: |
6762 次 |
| 最近记录: |