web-dev-qa-db-ja.com

自動生成されたクラスの@XmlRootElementアノテーションが欠落しているため、型を要素としてマーシャリングできません

自動生成されたJAXBクラスのフィールドを検証するための正規表現を提供したスキーマに対してClassオブジェクトを検証する必要があります。クラスオブジェクトを検証しようとすると、次のエラーが発生します。

@XmlRootElementアノテーションが欠落しているため、タイプとして「xyz」をマーシャリングできません

自動生成されたクラスオブジェクトを検証するために使用するコードは次のとおりです。

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

これを解決できる他の方法はありますか?

35
user656213

クラスに@XmlRootElement注釈がない場合は、JAXBElementのインスタンスでラップできます。 XMLスキーマからクラスを生成した場合、生成されたObjectFactoryには便利なメソッドがあるかもしれません。

このユースケースについては、ブログに詳しく書いています。

56
bdoughan

XSDからクラスを生成するには、mavenプラグイン「maven-jaxb2-plugin」を使用することをお勧めします。バインディングファイルを使用*。アノテーションを追加するxjb @XmlRootElement。

いくつかの例に従って

例:バインディングファイル

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

例:Mavenプラグイン

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

Wsdl定義内にxsdスキーマを持たないレガシーwsdlが原因で同じ問題に直面しました。この問題は、以下のようにxsdファイルからwsdlおよびDTDから操作を生成し、new ObjectFactory().createHandShake(new HandShake());をマーシャリングする2つのmavenプラグインを使用してこの問題を解決しました。

  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