2

次の例に従って、EclipseLink MOXy2.1.2とJava1.6を使用してドメインクラスに基づいてスキーマを生成しようとしています:http ://wiki.eclipse.org/EclipseLink/Examples/MOXy/JAXB/GenerateSchema

ただし、デフォルトのminOccurs値には問題があります。アノテーション@XmlElementで必要な属性が指定されていない場合、デフォルトでfalseに設定されます。つまり、スキーマを生成するときにminOccursは0になります。これは、SunのJAXB実装で期待どおりに機能します。ただし、Moxyを使用する場合、minOccursは生成されず、デフォルト値の1が暗黙指定されます。

例えば、

public Integer getDuration() {
   return duration;
}

生成する必要があります

<xs:element name="duration" type="xsd:int" minOccurs="0"/>

代わりに、Moxyを使用すると、

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

これは、minOccurs="1"がデフォルトであるためです。これはバグですか?これに対する回避策はありますか?

前もって感謝します!

4

2 に答える 2

1

EclipseLink 2.1.2 のプレリリース版を使用している可能性はありますか? EclipseLink 2.1.2 のリリース バージョンは、次の場所から入手できます。

次の例を実行すると:

package minoccurs;

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;

import org.eclipse.persistence.Version;

public class Demo {

    public static class Root {

        private Integer duration; 

        public Integer getDuration() {
            return duration;
        }

        public void setDuration(Integer duration) {
            this.duration = duration;
        }

    }

    public static class MySchemaOutputResolver extends SchemaOutputResolver {

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

    }

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Root.class);
        System.out.println(jc);
        System.out.println(Version.getVersionString());
        jc.generateSchema(new MySchemaOutputResolver());
    }
}

私は得る:

org.eclipse.persistence.jaxb.JAXBContext@16cd7d5
2.1.2.v20101206-r8635
<?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="duration" type="xsd:int" minOccurs="0"/>
      </xsd:sequence>
   </xsd:complexType>
</xsd:schema>

更新 #1

あなたの更新に基づいて、これは問題です。次の EclipseLink MOXy バグを開きました。

更新 #2

EclipseLink 2.2 ストリームでこのバグに対処しました。この修正は、12 月 21 日以降のナイトリー ダウンロードから入手できます。

この修正は、最終的に 2.1.3 パッチにも含まれます。

于 2010-12-16T15:05:47.943 に答える
0

Blaise さん、返信ありがとうございます。問題は、propOrder = {} を指定して xsd:all を生成しようとしていることが原因のようです。その注釈を使用すると、MOXy は minOccurs="0" を生成しません。問題を示すためにデモ クラスを変更しました。

package moxy.test;

import java.io.IOException;

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

import org.eclipse.persistence.Version;

public class Test {

    @XmlType(propOrder = {})
    public static class Root {

        private Integer duration;
        private Integer period;

        public Integer getPeriod() {
            return this.period;
        }

        public void setPeriod(Integer period) {
            this.period = period;
        }

        public Integer getDuration() {
            return duration;
        }

        public void setDuration(Integer duration) {
            this.duration = duration;
        }

    }

    public static class MySchemaOutputResolver extends SchemaOutputResolver {

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

    }

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Root.class);
        System.out.println(jc);
        System.out.println(Version.getVersionString());
        jc.generateSchema(new MySchemaOutputResolver());
    }
}

以下はMOXyで作成したものです。minOccurs 属性がないことに注意してください。

2.1.2.v20101206-r8635
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <xsd:complexType name="root">
      <xsd:all>
         <xsd:element name="duration" type="xsd:int"/>
         <xsd:element name="period" type="xsd:int"/>
      </xsd:all>
   </xsd:complexType>
</xsd:schema>

@XmlType(propOrder = {}) 注釈を削除すると、生成されたスキーマには minOccurs が存在しますが、要素はシーケンスとして含まれます。

org.eclipse.persistence.jaxb.JAXBContext@cdedfd
2.1.2.v20101206-r8635
<?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="duration" type="xsd:int" minOccurs="0"/>
         <xsd:element name="period" type="xsd:int" minOccurs="0"/>
      </xsd:sequence>
   </xsd:complexType>
</xsd:schema>

参考までに、Sun の JAXB 参照実装によって生成されるものを次に示します。

jar:file:/C:/Program%20Files/Java/jdk1.6.0_21/jre/lib/rt.jar!/com/sun/xml/internal/bind/v2/runtime/JAXBContextImpl.class Build-Id: 1.6.0_21
...

2.1.2.v20101206-r8635
<?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:all>
      <xs:element name="duration" type="xs:int" minOccurs="0"/>
      <xs:element name="period" type="xs:int" minOccurs="0"/>
    </xs:all>
  </xs:complexType>
</xs:schema>

前もって感謝します!

于 2010-12-16T18:27:50.893 に答える