JAXB生成的类中未设置默认布尔值

4
我正在尝试使用JAXB从xsd生成类,并利用xsd中的默认值。 但是,当我将xs:boolean元素的默认值设置为"true"时,该值未被设置,并且由于Boolean对象值未初始化为true,我会收到空指针异常。
<xs:element name="statsEnabled" type="xs:boolean" minOccurs="0" default="true"/>

我做错了什么?我们只能为xs:string设置默认值,而不能为xs:boolean设置默认值吗?

生成的xml文件类似于这样:

public class Cluster {

@XmlElement(defaultValue = "true")
protected Boolean topoEnabled;
@XmlElement(defaultValue = "true")
protected Boolean statsEnabled;

public Boolean isTopoEnabled() {
    return topoEnabled;
}

    public Boolean isStatsEnabled() {
    return statsEnabled;
}

}

当我尝试调用函数时:
Cluster cluster = new cluster();

if(cluster.isTopoEnabled)
  .....

或者

if(cluster.isStatEnabled)
  ....

我遇到了空指针错误。虽然在我的代码中已经处理了这个null值。

我很好奇为什么默认值不起作用。我做错了什么?应该怎么办? 或者说,默认值只适用于xs:string元素而不是其他元素吗?


你能展示一个出现此情况的XML示例吗? - wero
您必须认为您得到的是 Boolean 而不是 boolean,因此当找不到一个元素时,将会引发 null...实际上这是一个错误。 在此处找到解决方法 - Jordi Castilla
1
顺便问一下:你是否接受答案?(https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235) - wero
重复的问题:https://dev59.com/_1XTa4cB1Zd3GeqP2ozL?answertab=votes#tab-top - hasnae
@wero 感谢您告诉我如何接受答案。我之前不知道这个功能。 - Dhanesh Khurana
2个回答

0

一种选择是在反序列化完成后设置值。

这需要向您的对象添加以下方法并在其中设置默认值:

void afterUnmarshal(Unmarshaller u, Object parent) {
    this.isStatsEnabled = true;
}

请查看相关文档此处


-1
我刚在使用JDK 1.7.0_79时遇到了同样的问题。就我所知,当布尔字段是属性而不是元素时,由JAXB生成的POJO似乎会返回默认值。因此,如果您的模式具有灵活性,您可能希望将元素转换为属性(对于布尔字段来说,这种转换更有意义)。

也许这更适合作为对问题的评论。你的回答不是很令人信服。你可以进一步审查问题并更新你的回答。 - Michael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接