java java-ee jaxb schema

java - no se puede ordenar el tipo como un elemento porque falta una anotación @XmlRootElement para las clases generadas automáticamente



java-ee jaxb (2)

Necesito validar el objeto Class en mi esquema en el que he proporcionado una expresión regular para validar campos para clases JAXB generadas automáticamente. Cuando intento validar mi objeto de clase obtengo el siguiente error:

no se puede ordenar el tipo "xyz" como elemento porque falta una anotación @XmlRootElement

Aquí está el código que utilizo para validar mi objeto de clase autogenerado:

jc = JAXBContext.newInstance(obj.getClass()); source = new JAXBSource(jc, obj); Schema schema = schemaInjector.getSchema(); Validator validator = schema.newValidator(); validator.validate(source);

¿Hay alguna otra forma en que pueda resolver esto?


Le sugiero que use el plugin maven "maven-plugin-jaxb2" para generar clases desde un XSD. Use un archivo de enlace *. xjb para agregar anotaciones @XmlRootElement.

Siguiendo un ejemplo

por ejemplo, archivo de enlace

<bindings version="2.0" xmlns="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" xmlns:annox="http://annox.dev.java.net"> <globalBindings> <xjc:serializable uid="12343" /> <xjc:simple/> </globalBindings> </bindings>

por ejemplo, Maven Plugin

http://confluence.highsource.org/display/MJIIP/User+Guide

<plugin> <groupId>org.jvnet.jaxb2.maven2</groupId> <artifactId>maven-jaxb2-plugin</artifactId> <version>0.8.1</version> <executions> <execution> <phase>generate-sources</phase> <goals> <goal>generate</goal> </goals> </execution> </executions> <configuration> <args> <arg>-Xannotate</arg> <arg>-nv</arg> </args> <extension>true</extension> <forceRegenerate>true</forceRegenerate> <bindingDirectory>${basedir}/src/main/resources/schema/xjb</bindingDirectory> <bindingIncludes> <include>*.xjb</include> </bindingIncludes> <schemas> <schema> <fileset> <directory>${basedir}/src/main/resources/schema/</directory> <includes> <include>*.xsd</include> </includes> </fileset> </schema> </schemas> <debug>true</debug> <verbose>true</verbose> <plugins> <plugin> <groupId>org.jvnet.jaxb2_commons</groupId> <artifactId>jaxb2-basics</artifactId> <version>0.6.2</version> </plugin> <plugin> <groupId>org.jvnet.jaxb2_commons</groupId> <artifactId>jaxb2-basics-annotate</artifactId> <version>0.6.2</version> </plugin> <plugin> <groupId>org.jvnet.jaxb2_commons</groupId> <artifactId>jaxb2-namespace-prefix</artifactId> <version>1.1</version> </plugin> </plugins> </configuration> </plugin>


Si su clase no tiene una anotación @XmlRootElement , puede envolverla en una instancia de JAXBElement . Si generó sus clases a partir de un Esquema XML, entonces ObjectFactory generado puede tener un método conveniente para usted.

He escrito más sobre este caso de uso en mi blog: