Генерация схемы с minOccurs по умолчанию с использованием MOXy - PullRequest
2 голосов
/ 16 декабря 2010

Я пытаюсь использовать EclipseLink MOXy 2.1.2 и Java 1.6 для генерации схемы на основе классов моего домена, следуя этому примеру: http://wiki.eclipse.org/EclipseLink/Examples/MOXy/JAXB/GenerateSchema

Однако существует проблема со значением minOccurs по умолчанию. Если в аннотации @XmlElement не указан обязательный атрибут, по умолчанию он должен иметь значение false, что означает, что при генерации схемы minOccurs должно быть 0. Это работает, как и ожидалось, в реализации JAXB от Sun Однако при использовании 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", поскольку это значение по умолчанию. Это ошибка? Есть ли обходной путь для этого?

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 16 декабря 2010

Есть ли вероятность, что вы используете предварительную версию 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:

UPDATE # 2

Мы исправили эту ошибкув потоке EclipseLink 2.2.Исправление можно получить из ночных загрузок, начинающихся 21 декабря:

Это исправление также в конечном итоге будет включено в патч 2.1.3.

0 голосов
/ 16 декабря 2010

Спасибо за ваш ответ, Блейз. Кажется, проблема связана с тем, что я пытаюсь сгенерировать xsd: all, указав propOrder = {}. С этой аннотацией 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());
    }
}

Следующее производится с МОКСИ. Обратите внимание, что атрибут 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>

Заранее спасибо!

...