给出以下示例 xsd 片段:
< 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;
}
}
如何才能做到这一点?
JAXB 不会为具有默认值的元素生成与为具有默认值的属性相同的代码,因为XML 模式区分元素和属性默认值 http://www.w3.org/TR/xmlschema-0/#OccurrenceConstraints:
属性和元素的默认值都使用 default 属性来声明,尽管该属性在每种情况下的结果略有不同。当使用默认值声明属性时,该属性的值就是实例文档中显示为该属性值的任何值;如果该属性没有出现在实例文档中,则模式处理器为该属性提供与默认属性相同的值。请注意,只有当属性本身是可选的时,属性的默认值才有意义,因此同时指定默认值和除可选值以外的任何值都是错误的。
模式处理器处理默认元素的方式略有不同。当使用默认值声明元素时,该元素的值就是实例文档中作为元素内容出现的任何值;如果该元素没有任何内容出现,则模式处理器向该元素提供等于默认属性的值。然而,如果该元素没有出现在实例文档中,则模式处理器根本不提供该元素。总之,元素和属性默认值之间的差异可以表述为:当属性缺失时应用默认属性值,当元素为空时应用默认元素值。
您始终可以依靠缺失属性的默认值(这里是特殊的 getter),但存在缺失元素值的问题。
尽管如此,当您解组实例时,解组器知道如何处理默认值。请参阅此处了解详细信息:
- 元素默认值和编组 http://jaxb.java.net/2.2.5/docs/ch03.html#marshalling-element-default-values-and-marshalling
- 元素默认值和解组 http://jaxb.java.net/2.2.5/docs/ch03.html#unmarshalling-element-default-values-and-unmarshalling
XJC 不会添加 getter 代码或使用默认值初始化字段,因此如果您需要“空安全检查”,您可以自己添加manually在XJC生成代码后或者尝试使用一些插件自动执行:
- JAXB 2 默认值插件 http://java.net/projects/jaxb2-commons/pages/Default-Value
- CXF XJC 默认值插件 http://cxf.apache.org/cxf-xjc-dv.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)