2

Java クラスから xsd を生成するために、以下のゲッター メソッド レベルの XmlElement アノテーションを使用しました。

@XmlElement(type=Integer.class, required=true)

public int [] getTestArrayInt () { .... }

生成された XML 要素:

<xsd:element name="testArrayInt" type="xsd:int"/>

minOccurs のデフォルト値は 1 と言われているため、ここでは表示されていません。ただし、配列要素にリストする必要があるmaxOccurs="unbounded"がありません。Soap UI は、配列要素に maxOccurs="unbounded" が存在することを想定しています。その結果、Soap UI では、この要素は配列として扱われません。

注釈からtype=Integer.classを削除すると、XML でmaxOccurs="unbounded"が取得されるようになりました。

@XmlElement(required=true)要素の下に生成:

<xsd:element name="testArrayInt" type="xsd:int" maxOccurs="unbounded"/>

しかし、プリミティブデータ型には特にこの型が必要です。アノテーションにtypeがない場合、 minOccurs=1は必須ではない要素に対して欠落します(つまり、required =true が設定されていません)

誰かがこれで私を助けることができますか?

4

1 に答える 1

1

注: 私はEclipseLink JAXB(MOXy)のリーダーであり、JAXB(JSR-222)エキスパートグループのメンバーです。

説明する問題は、EclipseLink JAXB(MOXy)で発生しているようですが、JAXBリファレンス実装では発生していません。MOXyは、WebLogic 12.1.1のデフォルトのJAXBプロバイダーです( http://blog.bdoughan.com/2011/12/eclipselink-moxy-is-jaxb-provider-in.htmlを参照)。次のバグを使用して、この問題の進捗状況を追跡できます。WebLogicをご利用の場合は、適切なパッチを入手できるようにバグを入力してください。

Javaモデル

package forum13646211;

import javax.xml.bind.annotation.XmlElement;

public class Root {

    private int[] testArrayInt;

    @XmlElement(type=Integer.class)
    public int [] getTestArrayInt () {
        return testArrayInt;
    }

    public void setTestArrayInt(int[] array) {
        this.testArrayInt = array;
    }

}

スキーマ(JAXB RIによって生成)

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:complexType name="root">
    <xs:sequence>
      <xs:element name="testArrayInt" type="xs:int" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

スキーマ(EclipseLink JAXB(MOXy)によって生成されます)

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

スキーマ生成コード

package forum13646211;

import java.io.IOException;
import javax.xml.bind.*;
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(Root.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;
            }

        });

    }

}
于 2012-11-30T15:00:56.823 に答える