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

Posted

技术标签:

【中文标题】在 JAXB 生成的类中未设置默认布尔值【英文标题】:Default boolean value is not getting set in JAXB generated class 【发布时间】:2016-04-20 22:52:05 【问题描述】:

我打算使用 JAXB 从 xsd 生成类并使用 xsd 中的默认值。 但是当我将 xs:boolean 元素的默认值设置为“true”时。该值未设置,我得到空指针异常,因为布尔对象值尚未初始化为 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)
  ....

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

我只是想知道为什么默认值不起作用。我做错了什么,我该怎么办? 要么 是否默认值仅适用于 xs:string 元素而不适用于其他元素?

【问题讨论】:

你能展示一个发生这种情况的示例 XML 你一定认为你得到了Boolean而不是boolean,所以当找到一个缺失的元素时会引发null......这实际上是一个错误。 Find here a workaround 顺便说一句:你接受过答案吗 (meta.stackexchange.com/questions/5234/…) 重复***.com/questions/5423414/… @wero 感谢您让我知道接受答案。我以前不知道。 【参考方案1】:

我刚刚在使用 JDK 1.7.0_79 时遇到了同样的问题。值得一提的是,当布尔字段是属性而不是元素时,JAXB 生成的 POJO 似乎正在返回默认值。因此,如果您的架构具有灵活性,您可能希望将元素转换为属性(无论如何,这对于布尔字段来说更有意义)

【讨论】:

也许这更适合作为对该问题的评论。你的回答不是很有说服力。您可以进一步检查问题并更新您的答案。【参考方案2】:

一种选择是在解组完成后设置值。

这涉及将以下方法添加到您的对象并在其中设置默认值:

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

查看相关文档here

【讨论】:

以上是关于在 JAXB 生成的类中未设置默认布尔值的主要内容,如果未能解决你的问题,请参考以下文章

带布尔值的碰撞器

如何根据决策(布尔)字段在现有表单的视图中设置默认值?

更改布尔值的默认值

xsd生成的Java代码中的布尔值

MS Access 布尔字段和默认 (True) 值

编辑布尔值和运算符