2012-11-30 3 views
2

Я использовал ниже аннотацию XmlElement уровня метода getter для генерации xsd из класса Java.JAXB XmlElement maxOccurs Проблема с элементами массива

@XmlElement (тип = Integer.class, требуется = истина)

общественного ИНТ [] getTestArrayInt() {....}

Сгенерированный XML элемент:

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

Значение minOccurs по умолчанию считается 1. Следовательно, оно не отображается здесь. Но maxOccurs = "неограниченный", который должен быть указан для элементов массива, отсутствует. Мыльный пользовательский интерфейс ожидает, что maxOccurs = "unbounded" будет присутствовать для элементов массива. В результате в пользовательском интерфейсе Soap этот элемент не рассматривается как массив.

Когда я удалил тип = Integer.class из аннотации, я начал получать MaxOccurs = "неограниченным" в XML.

@XmlElement (требуется = истина) генерироваться ниже элемента:

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

Но мне нужен этот типа специально для примитивных типов данных. Без типа в аннотации, MinOccurs = 1 получает не хватает для элементов, которые не требуются (т.е. требуется = истина не установлен).

Может кто-нибудь помочь мне в этом?

ответ

1

Примечание: Я - лидер EclipseLink JAXB (MOXy) и входит в группу экспертов JAXB (JSR-222).

Проблема, которую вы описываете, появляется в EclipseLink JAXB (MOXy), но не эталонная реализация JAXB. MOXy является поставщиком JAXB по умолчанию в WebLogic 12.1.1 (см.: 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; 
      } 

     }); 

    } 

} 
+0

Большое спасибо. Исправлена ​​ошибка в WLS 12.1.2, которая еще не выпущена. – saumyak

Смежные вопросы