如何生成带有xs:元素的XSD,使用JAXB是可选的?

时间:2012-11-28 00:17:43

标签: java jaxb schema

我的模型对象看起来像这样:

@XmlRootElement(name = "appConfig")
@XmlType(propOrder = {})
public class Config implements Serializable {
...
private int advancedFooBar;
...
@XmlElement(name = "advancedfoobar")
public int getAdvancedFooBar() {
    return advancedFooBar;
}

public void setAdvancedFooBar(int advancedFooBar) {
    this.advancedFooBar = advancedFooBar ;
}

当我使用JXC生成针对此类的模式时,我最终得到以下属性的以下内容:

<xs:element name="advancedfoobar" type="xs:int"/>

我希望这是一个可选元素,所以我尝试更改

@XmlElement(name = "advancedfoobar")

@XmlElement(name = "advancedfoobar", required=false)

但是,这并未导致对生成的架构进行任何更改。我需要做什么才能在生成的模式中将“advancedfoobar”元素定义为可选项?

我在Windows 7旗舰版x64上使用JDK 1.7.0_U3。

感谢。

-Noah

1 个答案:

答案 0 :(得分:4)

JAVADOCS说什么

根据@XmlElement的Javadoc(参见:http://docs.oracle.com/javase/6/docs/api/javax/xml/bind/annotation/XmlElement.html#required%28%29

  

如果required()为false,则Javabean属性将映射到XML   使用minOccurs =“0”的模式元素声明。对于a,maxOccurs为“1”   单值属性和多值属性的“无界”。

以下映射的advancedfoobar架构定义应为minOccurs=0

@XmlElement(name = "advancedfoobar")
public int getAdvancedFooBar() {
    return advancedFooBar;
}

@XmlElement(name = "advancedfoobar", required=false)
public int getAdvancedFooBar() {
    return advancedFooBar;
}

MOXY和参考实施中的BU

EclipseLink JAXB (MOXy)和JAXB参考实现中似乎存在关于基元和可选元素的错误。我已经针对MOXy打开了以下错误。


解决方法

您可以设置Integer类型的属性,而不是int。或者更好的是,只需将type注释上的@XmlElement属性设置为Integer即可。默认情况下,任何能够保留null值的类型都是可选的。

<强>配置

package forum13595629;

import java.io.Serializable;
import javax.xml.bind.annotation.*;

@XmlRootElement(name = "appConfig")
@XmlType(propOrder = {})
public class Config implements Serializable {

    private int advancedFooBar;

    @XmlElement(name = "advancedfoobar", type=Integer.class)
    public int getAdvancedFooBar() {
        return advancedFooBar;
    }

    public void setAdvancedFooBar(int advancedFooBar) {
        this.advancedFooBar = advancedFooBar;
    }

}

<强>演示

package forum13595629;

import java.io.IOException;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.SchemaOutputResolver;
import javax.xml.transform.Result;
import javax.xml.transform.stream.StreamResult;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Config.class);

        jc.generateSchema(new SchemaOutputResolver() {

            @Override
            public Result createOutput(String namespaceUri,
                    String suggestedFileName) throws IOException {
                StreamResult result = new StreamResult(System.out);
                result.setSystemId(suggestedFileName);
                return result;
            }

        });

    }

}

<强>输出

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <xsd:complexType name="config">
      <xsd:all>
         <xsd:element name="advancedfoobar" type="xsd:int" minOccurs="0"/>
      </xsd:all>
   </xsd:complexType>
   <xsd:element name="appConfig" type="config"/>
</xsd:schema>