2014-07-01 12 views
27

Devo convalidare l'oggetto Class contro il mio schema in cui ho fornito un'espressione regolare per convalidare i campi per le classi JAXB generate automaticamente. Quando cerco di convalidare il mio oggetto di classe ottengo sotto l'errore:Impossibile eseguire il marshalling come elemento perché manca un'annotazione @XmlRootElement per le classi generate automaticamente

grado di maresciallo tipo "xyz" come un elemento perché manca un'annotazione @XmlRootElement

Ecco il codice che uso per validare il mio oggetto classe autogenerato:

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

C'è qualche altro modo per risolvere questo problema?

risposta

45

Se la classe non ha un'annotazione @XmlRootElement, è possibile eseguirne il wrapping in un'istanza di JAXBElement. Se hai generato le tue classi da uno schema XML, allora lo ObjectFactory generato potrebbe avere un metodo comodo per te.

Ho scritto più su questo caso d'uso sul mio blog:

+0

Grazie per l'aiuto. Ho modificato il mio codice come da soluzione sul tuo blog ma sto ancora ricevendo lo stesso errore. codice modificato è: 'QName qName = new QName (" http://www.w3.org/2001/XMLSchema ", obj.toString());' 'JAXBElement e = createJAXBElement (qName, obj.getClass(), obj); '' jc = JAXBContext.newInstance (e.getValue(). getClass()); '' Marshaller m = jc.createMarshaller(); '' source = new JAXBSource (jc, m.getClass()); ' 'Schema schema = schemaInjector.getSchema();' 'Validator validator = schema.newValidator();' 'validator.validate (source);' _Please advice_ – user656213

+0

Ho trovato utile questa risposta: http://stackoverflow.com/a/2172942/58363 Fornisce una formulazione alternativa alla risposta di @ Blaise-doughan. –

2

vi consiglio di usare Maven plugin "maven-plugin-jaxb2" per generare le classi da un XSD. Utilizzare un file di rilegatura *. xjb per aggiungere annotazioni @XmlRootElement.

Seguendo qualche esempio

per esempio file di collegamento

<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> 

per esempio 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> 
+0

Si noti che '' è il pezzo rilevante qui che aggiungerà l'annotazione '@ XmlRootElement'. Questa è una personalizzazione del fornitore nel RI JAXB, vedere qui: https://jaxb.java.net/nonav/2.2.1/docs/vendorCustomizations.html. Fa molto di più che aggiungere questa annotazione. Se si desidera solo '@ XmlRootElement', è possibile utilizzare l'estensione jaxb2-basics-annotate. –

Problemi correlati