2

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

@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 ;
}

当我针对此类 w/JXC 生成模式时,我最终得到以下属性:

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

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

@XmlElement(name = "advancedfoobar")

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

但是,这并没有导致生成的模式发生任何变化。我需要做什么才能在生成的架构中将“advancedfoobar”元素定义为可选?

我在 Windows 7 Ultimate x64 上使用 JDK 1.7.0_U3。

谢谢。

-诺亚

4

1 回答 1

4

JAVADOCS 说什么

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

如果 required() 为 false,则 Javabean 属性将映射到具有 minOccurs="0" 的 XML Schema 元素声明。maxOccurs 对于单值属性为“1”,对于多值属性为“无界”。

的架构定义advancedfoobar应该minOccurs=0用于以下映射:

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

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

MOXy 和参考实现中的错误

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


解决方法

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

配置

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>
于 2012-11-28T00:37:07.337 回答