web-dev-qa-db-fra.com

impossible de classer le type en tant qu'élément car il manque une annotation @XmlRootElement pour les classes générées automatiquement

Je dois valider l'objet Class par rapport à mon schéma dans lequel j'ai fourni une expression régulière pour valider les champs des classes JAXB générées automatiquement. Lorsque j'essaie de valider mon objet de classe, l'erreur ci-dessous apparaît:

impossible de classer le type "xyz" en tant qu'élément car il manque une annotation @XmlRootElement

Voici le code que j'utilise pour valider mon objet de classe généré automatiquement: 

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

Existe-t-il un autre moyen de résoudre ce problème?

32
user656213

Si votre classe n'a pas d'annotation @XmlRootElement, vous pouvez l'envelopper dans une instance de JAXBElement. Si vous avez généré vos classes à partir d'un schéma XML, la ObjectFactory générée peut avoir une méthode pratique pour vous.

J'ai écrit plus sur ce cas d'utilisation sur mon blog:

53
Blaise Doughan

Je vous suggère d'utiliser le plugin maven "maven-plugin-jaxb2" pour générer des classes à partir d'un XSD. Utilisez un fichier de liaison *. xjb pour ajouter des annotations @XmlRootElement.

Après quelques exemples

par exemple, fichier de liaison

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

par exemple, 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>
4
Xstian

J'ai rencontré le même problème en raison de l'héritage wsdl qui n'a pas de schéma xsd dans la définition de WSDL. J'ai résolu ce problème en ayant deux plugins Maven à générer des opérations à partir de wsdl ainsi que DTD à partir du fichier xsd comme ci-dessous et pour marshalling new ObjectFactory().createHandShake(new HandShake());

  public boolean handShake() {
        JAXBElement<HandShake> request = new ObjectFactory().createHandShake(new HandShake());
        logger.info(String.format("request: {0}", "handshake request"));
        logger.debug("sending request");
        HandShakeResponse handShakeResponse = ((JAXBElement<HandShakeResponse>) getWebServiceTemplate()
                .marshalSendAndReceive(request, new SoapActionCallback(
                        "urn:handShake"))).getValue();
        logger.debug("receive response");
        return handShakeResponse.isReturn();
    }

<plugin>
                <groupId>org.jvnet.jaxb2.maven2</groupId>
                <artifactId>maven-jaxb2-plugin</artifactId>
                <version>0.14.0</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <schemaLanguage>WSDL</schemaLanguage>
                    <generatePackage>${contextPathWSDL}</generatePackage>
                    <schemas>
                        <schema>
                            <url>${merchant.WSDL}</url>
                        </schema>
                    </schemas>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.jvnet.jaxb2.maven2</groupId>
                <artifactId>maven-jaxb2-plugin</artifactId>
                <version>0.14.0</version>
                <executions>
                    <execution>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <schemaDirectory>${basedir}/src/main/resources/xsds</schemaDirectory>
                    <schemaIncludes>
                        <include>*.xsd</include>
                    </schemaIncludes>
                    <generatePackage>${contextPathXSD}</generatePackage>
                    <generateDirectory>${basedir}/target/generated-sources/DTD</generateDirectory>
                </configuration>
            </plugin>
0
Mohamed.Abdo