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

JAXB xjc:如果值为null,如何为返回空的字符串生成代码?,jaxb,Jaxb,给出以下示例xsd代码段: < xs:attribute name="SEGMENT" default="" use="optional" type="xs:string"/ > < xs:element name="NAME" default="" type="xs:string"/ > 我的问题是如何让它对xs:element对象执行相同的操作?换句话说,给定以下xsd代码段: < xs:attribute name="SEGMENT" default=

给出以下示例xsd代码段:

< xs:attribute name="SEGMENT"  default="" use="optional" type="xs:string"/ >
< xs:element name="NAME" default="" type="xs:string"/ >
我的问题是如何让它对
xs:element
对象执行相同的操作?换句话说,给定以下xsd代码段:

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

如何做到这一点?

JAXB为具有默认值的元素生成的代码与为具有默认值的属性生成的代码不同,因为:

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

模式处理器对默认元素的处理略有不同。当使用默认值声明元素时,元素的值是实例文档中作为元素内容出现的任何值;如果元素显示时没有任何内容,架构处理器将为元素提供一个与默认属性相同的值。但是,如果该元素没有出现在实例文档中,则模式处理器根本不提供该元素。总之,元素和属性默认值之间的差异可以表述为:当属性缺失时应用默认属性值,当元素为空时应用默认元素值

对于缺少的属性(这里是特殊的getter),您可以始终使用默认值,但是有一个catch缺少元素值

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

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


字段初始值设定项绝对合适。现在的问题是如何让xjc向每个类中的每个字符串添加空字符串初始值设定项?也许在一个单独的绑定文件中?@java luva:我在回答中添加了更多细节,还发现了一些看起来很有趣的插件。看看是否有帮助。谢谢你提供的额外信息。不过我有一个问题。您发送的链接涉及设置maven或ant任务。我不使用maven。设置ant任务时的问题是,我得到了一个链接错误,指出不同的类加载的名称相同。我认为,问题在于Java1.6内置了xjc,通过将jaxb-xjc-2.1.9.jar添加到我的xjc taskdef类路径中,它们是相互冲突的。我的问题是,如何让ant脚本忽略1.6(我的JAVA_HOME设置为1.6)并使用我的taskdef类路径,或者在taskdef中引用1.6 xjc jar?@JAVA luva:您是否尝试过隔离任务并单独调用它?假设所有jar和模式文件都位于
c:\temp
中,请尝试以下操作:
java-jar c:\temp\jaxb-xjc.jar-classpath c:\temp\jaxb-api.jar;c:\temp\jaxb-impl.jar;c:\temp\jaxb2-default-value-1.1.jar-d c:\temp-extension-Xdefault-value-verbose c:\temp\YourSchema.xsd
我感谢您的反馈,但您最后的建议不起作用。如果在java中使用“-jar”选项,则会忽略类路径。我可以单独使用-classpath属性,但是您必须将所需的每个jar添加到该路径中(对于ant也是如此),当我尝试在没有-jar选项的情况下运行时,仍然会得到“Error:Main method not found in class com.sun.tools.xjc.XJCTask”