JAXB xjc:如果值为null,如何为字符串生成返回空的代码?

jav*_*uva 8 jaxb

给出以下示例xsd片段:

< xs:attribute name="SEGMENT"  default="" use="optional" type="xs:string"/ >
Run Code Online (Sandbox Code Playgroud)

当xjc生成包含SEGMENTbean属性的类时,将自动生成以下getter:

public String getSEGMENT() {
    if (segment == null) {
        return "";
    } else {
        return segment;
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是你如何让xs:element对象做同样的事情?换句话说,给定以下xsd片段:

< xs:element name="NAME" default="" type="xs:string"/ >
Run Code Online (Sandbox Code Playgroud)

我想知道我是否可以让xjc生成以下内容:

public String getNAME() {
    if (name == null) {
        return "";
    } else {
        return name;
    }
}
Run Code Online (Sandbox Code Playgroud)

如何才能做到这一点?

Bog*_*dan 2

JAXB 不会为具有默认值的元素生成与为具有默认值的属性生成相同的代码,因为XML 模式会区分元素和属性默认值

属性和元素的默认值都使用 default 属性来声明,尽管该属性在每种情况下的结果略有不同。当使用默认值声明属性时,该属性的值就是实例文档中显示为该属性值的任何值;如果该属性没有出现在实例文档中,则模式处理器为该属性提供与默认属性相同的值。请注意,只有当属性本身是可选的时,属性的默认值才有意义,因此同时指定默认值和除可选值以外的任何值都是错误的。

模式处理器处理默认元素的方式略有不同。当使用默认值声明元素时,该元素的值就是实例文档中作为元素内容出现的任何值;如果该元素没有任何内容出现,则模式处理器为该元素提供等于默认属性的值。然而,如果该元素没有出现在实例文档中,则模式处理器根本不提供该元素。总之,元素和属性默认值之间的差异可以表述为:当属性缺失时应用默认属性值,当元素为空时应用默认元素值。

您始终可以依靠缺失属性的默认值(这里是特殊的 getter),但存在缺失元素值的问题。

尽管如此,当您解组实例时,解组器知道如何处理默认值。详细信息请参见此处:

XJC 不会添加 getter 代码或使用默认值初始化字段,因此如果您需要“空安全检查”,您可以在 XJC 生成代码后自己手动添加或尝试使用某些插件来完成自动地: