JAXB @XmlElements para tener minOccurs = 1

Entonces quiero tener una lista para anotar con @XmlElements como el siguiente

@XmlElements(
        {
            @XmlElement(name = "Apple", type = Apple.class),
            @XmlElement(name = "Orange", type = Orange.class),
            @XmlElement(name = "Mango", type = Mango.class)
        }
)
public List<Fruit> getEntries() {
        return fruitList;
}

Me pregunto si hay una manera de hacer cumplir la lista para que contenga al menos 1 elemento, porque en este momento, el xsd parece

<xs:complexType name="fruitList">
    <xs:sequence>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="Apple" type="tns:apple"/>
        <xs:element name="Orange" type="tns:orange"/>
        <xs:element name="Mango" type="tns:mango"/>
      </xs:choice>
    </xs:sequence>
  </xs:complexType>

preguntado el 16 de mayo de 11 a las 20:05

¿Te refieres a un esquema generado a partir de tu código Java? -

2 Respuestas

Suponiendo que Apple, Orange y Mango son subclases de Fruit, es posible que desee anotar el entries propiedad con @XmlElementRef que corresponde a grupos de sustitución en el esquema XML, en lugar de @XmlElements que corresponde al concepto de elección.

@XmlElementRef
public List<Fruit> getEntries() {
        return fruitList;
}

Esto supone que las clases Apple, Orange y Mango amplían la clase Fruit y están anotadas con @XmlRootElement

@XmlRootElement
public class Apple extends Fruit {
   ...
}

Para más información

contestado el 17 de mayo de 11 a las 00:05

¿Cómo me va a ayudar esto a hacer cumplir al menos 1 elemento en la lista? - Denniss

@denniss - Tienes razón en eso @XmlElementRef también producirá minOccurs="0". Simplemente lo estaba ofreciendo como un mapeo alternativo (más simple) para la propiedad, asumiendo que la herencia estaba involucrada. JAXB se centra más en el mapeo a XML que en las restricciones de esquema, por lo que es posible que no haya una manera de obtener el minOccurs='1' que buscas. Siempre puede modificar el esquema XML generado por JAXB. - bdoughan

Sugiero comprobar:

@XmlElements(
    {
        @XmlElement(name = "Apple", type = Apple.class, required = true),
        @XmlElement(name = "Orange", type = Orange.class, required = true),
        @XmlElement(name = "Mango", type = Mango.class, required = true)
    }
)

Respondido 05 ago 11, 12:08

También estaba buscando una solución al problema, y ​​esta hace el truco. Omite XML generado minOccurs atributo que se traduce en el predeterminado (= 1). - user268396

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.