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

このクラスに対してJXCを使用してスキーマを生成すると、上記のプロパティに対して次のようになります。

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

これをオプションの要素にしたいので、変更してみました

@XmlElement(name = "advancedfoobar")

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

ただし、生成されたスキーマは変更されませんでした。生成されたスキーマで「advancedfoobar」要素がオプションとして定義されるようにするには、何をする必要がありますか?

Windows 7Ultimatex64でJDK1.7.0_U3を使用しています。

ありがとう。

-ノア

4

1 に答える 1

4

JAVADOCSのコメント

Javadocによると@XmlElementhttp://docs.oracle.com/javase/6/docs/api/javax/xml/bind/annotation/XmlElement.html#required%28%29を参照)

required()がfalseの場合、JavabeanプロパティはminOccurs="0"を使用してXMLスキーマ要素宣言にマップされます。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に対して次のバグを開きました。


回避策

Integerの代わりにtypeのプロパティを作成できます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 に答える