partir online generate generar from classes clases xsd jaxb code-generation xjc

online - xsd to java jaxb



XJC Generar entero en lugar de int (1)

El siguiente esquema debe generar dos campos primitivos int en una clase Value , pero en su lugar genera una primitiva int para el elemento y java.lang.Integer para el atributo .

<?xml version="1.0" encoding="UTF-8"?> <xsd:schema version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.com/test" xmlns:test="http://www.example.com/test" elementFormDefault="qualified"> <xsd:element name="values"> <xsd:complexType> <xsd:sequence minOccurs="0" maxOccurs="unbounded"> <xsd:element ref="test:value" /> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="value"> <xsd:complexType> <xsd:sequence> <!-- Is generated as primitive int --> <xsd:element name="element" type="xsd:int" /> </xsd:sequence> <!-- Is generated as java.lang.Integer --> <xsd:attribute name="attribute" type="xsd:int" /> </xsd:complexType> </xsd:element> </xsd:schema>

He revisado la documentación de JAXB para ver si hay algo que diga que los atributos y elementos pueden generarse de manera diferente y no encontrar nada.

¿Alguien puede explicar esto? ¿Hay una solución para hacer que el atributo genere como una primitiva int ?


No estoy del todo seguro de que esta es la respuesta, pero tuve una epifanía al depurar mi aplicación.

La multiplicidad predeterminada para un elemento en un esquema XML es 1..1 (required) mientras que la multiplicidad predeterminada para un atributo es 0..1 (optional) .

  1. Entonces, como el elemento es requerido y una primitiva en Java tiene un valor predeterminado (muy probablemente 0), tiene sentido generar un <xsd:element type="xsd:int" /> como una primitiva Java.

  2. Como el atributo es opcional, existe la posibilidad de que sea nillable lo que no sería posible con una primitiva. Java.lang.Integer es un Object y, por lo tanto, permite que sea null , por lo que tiene sentido generar un <xsd:attribute type="xsd:int" /> como un java.lang.Integer .

Si hace que se requiera un atributo ( <xsd:attribute type="xsd:int" use="required" /> ), se generará como una primitiva int . No he visto documentación de JAXB que diga esto explícitamente, pero eso no significa que no exista; quizás solo me lo perdí.