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

时间:2012-12-11 17:49:51

标签: jaxb

给出以下示例xsd snippet:

< xs:attribute name="SEGMENT"  default="" use="optional" type="xs:string"/ >

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

public String getSEGMENT() {
    if (segment == null) {
        return "";
    } else {
        return segment;
    }
}

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

< xs:element name="NAME" default="" type="xs:string"/ >

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

public String getNAME() {
    if (name == null) {
        return "";
    } else {
        return name;
    }
}

如何做到这一点?

1 个答案:

答案 0 :(得分:2)

对于具有默认值的元素,JAXB不会为具有默认值的属性生成相同的代码,因为XML schema differentiates between element and attribute defaults

  

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

     

架构处理器稍微区别对待默认元素。当使用默认值声明元素时,元素的值是在实例文档中显示为元素内容的任何值;如果元素没有任何内容,则架构处理器为元素提供的值等于默认属性的值。但是,如果元素未出现在实例文档中,则架构处理器根本不提供该元素。总之,元素和属性默认值之间的差异可以表示为:默认属性值在缺少属性时应用,默认元素值在元素为空时应用。

你总是可以依靠缺失属性的默认值(从这里得到特殊的getter),但是有一个缺少元素值的catch。

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

XJC不会添加getter代码或使用默认值初始化字段,因此如果您需要“null safe check”,您可以在生成代码之后自己手动添加 。 XJC或尝试使用一些插件自动执行: