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: