给出以下示例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;
}
}
如何做到这一点?
答案 0 :(得分:2)
对于具有默认值的元素,JAXB不会为具有默认值的属性生成相同的代码,因为XML schema differentiates between element and attribute defaults:
使用默认属性声明属性和元素的默认值,尽管此属性在每种情况下的结果略有不同。当使用默认值声明属性时,属性的值是在实例文档中显示为属性值的任何值;如果属性未出现在实例文档中,则架构处理器为该属性提供的值等于默认属性的值。请注意,属性的默认值仅在属性本身是可选的时才有意义,因此指定默认值和除可选值以外的任何值都是错误的。
架构处理器稍微区别对待默认元素。当使用默认值声明元素时,元素的值是在实例文档中显示为元素内容的任何值;如果元素没有任何内容,则架构处理器为元素提供的值等于默认属性的值。但是,如果元素未出现在实例文档中,则架构处理器根本不提供该元素。总之,元素和属性默认值之间的差异可以表示为:默认属性值在缺少属性时应用,默认元素值在元素为空时应用。
你总是可以依靠缺失属性的默认值(从这里得到特殊的getter),但是有一个缺少元素值的catch。
尽管如此,当您解组实例时,unmarshaller知道如何处理默认值。有关详细信息,请参见此处:
XJC不会添加getter代码或使用默认值初始化字段,因此如果您需要“null safe check”,您可以在生成代码之后自己手动添加 。 XJC或尝试使用一些插件自动执行: