JAXB对象使用默认值初始化

11

关于JAXB有个小问题。


给定:

  • Java 1.5; jaxb -jars from jaxws-2_0.
  • .xsd模式和生成的JAXB类。
  • .xsd中的每个简单元素都具有默认值。因此,类成员具有注释,如"@XmlElement(name = "cl_fname", required = true, defaultValue = "[______]")"

要求:


获取代表xml的java对象(根元素),并且每个成员都使用默认值初始化。


当我尝试编组没有显式设置值的xml时,默认值没有意义...是否存在一种方法可以编组填充了默认值的xml而不需要自定义生成的类?

.xsd示例:

<xs:element name="document">
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="d_int"/>
            <xs:element ref="d_double"/>
            <xs:element ref="d_string"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

<xs:element name="d_int" type="xs:int" default="-1"/>
<xs:element name="d_double" type="xs:double" default="-1.0"/>
<xs:element name="d_string" type="xs:string" default="false"/>

并且是Java类:

public class Document {
    @XmlElement(name = "d_int", defaultValue = "-1")
    protected int dInt;
    @XmlElement(name = "d_double", defaultValue = "-1.0")
    protected double dDouble;
    @XmlElement(name = "d_string", required = true, defaultValue = "Default")
    protected String dString;
...
}
2个回答

22

注释中指定的默认值只有在反序列化后才能生效。
对此进行反序列化。

<document>
   <d_int/>
   <d_double/>
   <d_string/>
</document>  

你将会得到一个带有默认值的对象(-1, -1.0, "Default")。

如果你想要设置序列化的默认值,你应该这样做。

public class Document {
    @XmlElement(name = "d_int", defaultValue = "-1")
    protected int dInt = 100;
    @XmlElement(name = "d_double", defaultValue = "-1.0")
    protected double dDouble = -100;
    @XmlElement(name = "d_string", required = true, defaultValue = "Default")
    protected String dString = "def";
...
}    

JAXB仅针对未解组的情况生成默认值


2
我一直在想,如果您同时指定了“defaultValue”,那么将字段标记为“required”是否有意义。这似乎是矛盾的,不是吗? - bvdb
如果省略 defaultValue,那么分配给字段的值是否将成为反编组和编组的默认值,或者在反编组时没有默认值?(例如,如果您取消 dIntdefaultValue =“-1”,那么 100 是否也是反编组的默认值?) - mapeters

1

要从XSD提供的默认值初始化类成员,您可以使用XJC的default-value-plugin。

请参见插件的网站

请注意,如该文档中所述的ant任务定义对我无效。正如在这里所解释的那样,必须将XJC和插件的类路径分开。在调用插件时指定插件的路径对我有效:

<xjc schema="some.xsd" >
    <arg value="-Xdefault-value"/>
    <classpath>
        <pathelement location="lib/xjc-plugins/jaxb2-default-value-1.1.jar"/>
    </classpath>
</xjc>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接