2014-07-01 11 views
27

Potrzebuję zweryfikować obiekt klasy w stosunku do mojego schematu, w którym podałem wyrażenie regularne, aby zweryfikować pola automatycznie generowanych klas JAXB. Kiedy staram się potwierdzić moją klasę obiektu otrzymuję poniżej błędu:Nie można ustawić typu marszałka jako elementu, ponieważ brakuje mu adnotacji @XmlRootElement dla wygenerowanych automatycznie klas

stanie zebrać typu „xyz” jako element, ponieważ brakuje adnotacji @XmlRootElement

Oto kod, który używam do sprawdzania poprawności mój obiekt klasy generowany automatycznie:

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

Czy istnieje inny sposób rozwiązania tego problemu?

Odpowiedz

45

Jeśli twoja klasa nie ma adnotacji @XmlRootElement, możesz ją opakować w instancji JAXBElement. Jeśli wygenerowałeś klasy ze schematu XML, wygenerowany ObjectFactory może mieć dla ciebie wygodną metodę.

Pisałem więcej o tym przypadku używać na moim blogu:

+0

Dzięki za pomoc. Zmodyfikowałem swój kod zgodnie z rozwiązaniem na Twoim blogu, ale wciąż mam ten sam błąd. zmodyfikowany kod to: '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()); ' 'Schemat schematu = schemaInjector.getSchema();' 'Validator validator = schema.newValidator();' 'validator.validate (source);' _Please advice_ – user656213

+0

Ta odpowiedź była pomocna: http://stackoverflow.com/a/2172942/58363 Daje alternatywne brzmienie odpowiedzi @ Blaise-doughana. –

2

Proponuję używać Maven plugin "maven-plugin-jaxb2" do generowania klas z XSD. Użyj pliku powiązania *. xjb, aby dodać adnotacje @XmlRootElement.

Po jakiś przykład

np Binding plik

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

np 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

Należy zauważyć, że '' jest tutaj odpowiednim elementem, który doda adnotację '@ XmlRootElement'. Jest to dostosowanie dostawcy w JAXB RI, patrz tutaj: https://jaxb.java.net/nonav/2.2/docs/vendorCustomizations.html. To więcej niż tylko dodanie tej adnotacji. Jeśli chcesz tylko '@ XmlRootElement', możesz użyć rozszerzenia jaxb2-anotate-anotate. –

Powiązane problemy