6

サードパーティのwsdlファイルに基づくWebサービスの利用に関して質問があります。

指定されたwsdlを取得し、必要な120以上のJavaファイルを生成しました。このプロセスは、xjcを使用して実行されました。Sping環境内で、公開されているいくつかのサービスを呼び出すことで、いくつかのJUnitテストを正常に作成することができました

ただし、これらのサービスを正常にテストするには、生成されたJavaファイルに@XmlRootElementアノテーションを追加する必要がありました。そうしないと、次のようなエラーが発生します

"com.sun.istack.SAXException2:@XmlRootElementアノテーションがないため、タイプ"com.beam.services.client.UserGetRequestData"を要素としてマーシャリングできません"

検索を使い果たしました…wsdlファイルがどのように作成/構造化されるかを制御できません。@XmlRootElementアノテーションが含まれていることを確認するためにJavaファイルを生成したり、上記のエラーを回避する方法でクライアント側のコードを記述したりするにはどうすればよいですか?

ありがとうございました。

4

2 に答える 2

2

@XmlRootElement が本当に必要な場合、タイプが 1 つの要素のみに使用されている場合は、シンプル バインディング モードを使用できます。JAXB にデフォルトでアノテーションが含まれていない理由と単純バインディングの使用方法については、https ://community.oracle.com/blogs/kohsuke/2006/03/03/why-does-jaxb-put-xmlrootelement で説明しています。 -時々-常にではない:

あなたのスキーマは、XJC が現在コンパイルしていない他のスキーマによって使用される可能性があります

そのような概念は仕様では定義されていませんが、実験として、XJC にはそのような積極的な最適化モードがあり、暫定的に「単純なバインド モード」と呼ばれています。

ブログ移転の際にサンプルが消えてしまったようですが、こんな感じでした。

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="1.0" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" jaxb:extensionbindingprefixes="xjc">
  <xs:annotation>
    <xs:appinfo>
      <jaxb:globalbindings>
        <xjc:simple/>
      </jaxb:globalbindings>
    </xs:appinfo>
  </xs:annotation>      
  <xs:element name="foo" type="bar"/>
  <xs:complextype name="bar"/>
</xs:schema>

もう 1 つの可能性は、JAXBElement でラップすることです。ObjectFactory には、これらのラップされたオブジェクトを作成するためのメソッドが含まれている必要があります。

于 2012-12-08T09:12:12.107 に答える
1

mavem を使用している場合は、このリンクを確認してください。

Maven プロジェクトを作成します。以下に POM を示します。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.zmeu</groupId>
    <artifactId>zmeu-blog-maven-jaxb</artifactId>
    <version>1.0-SNAPSHOT</version>
    <name>ZMEU Blog Maven JAXB</name>
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.jvnet.jaxb2.maven2</groupId>
                <artifactId>maven-jaxb2-plugin</artifactId>
                <version>0.8.0</version>
                <configuration>
                    <schemaDirectory>src/main/resources/schema</schemaDirectory>
                    <bindingDirectory>src/main/resources/schema</bindingDirectory>
                    <generatePackage>org.zmeu.blog.jaxb</generatePackage>
                    <strict>false</strict>
                    <extension>true</extension>
                    <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>
                    </plugins>
                    <args>
                        <arg>-Xannotate</arg>
                        <arg>-XtoString</arg>
                    </args>
                </configuration>
                <executions>
                    <execution>
                        <id>generate</id>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <dependency>
            <groupId>org.jvnet.jaxb2_commons</groupId>
            <artifactId>jaxb2-basics-runtime</artifactId>
            <version>0.6.2</version>
        </dependency>
    </dependencies>
</project>

XML スキーマ (schema.xsd) を記述します。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:element name="user" type="user" />
    <xs:element name="userList" type="userList" />

    <xs:complexType name="user">
        <xs:all>
            <xs:element name="id" type="xs:long" minOccurs="0" />
            <xs:element name="name" type="xs:string" />
            <xs:element name="registrationDate" type="xs:dateTime" />
        </xs:all>
    </xs:complexType>

    <xs:complexType name="userList">
        <xs:sequence>
            <xs:element name="user" type="user" minOccurs="0" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>

</xs:schema>

JAXB バインディング (binding.xjb) をカスタマイズします。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<jaxb:bindings xmlns:jaxb="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:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:annox="http://annox.dev.java.net"
    xsi:schemaLocation="http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd"
    version="2.1">
    <jaxb:globalBindings>
        <!-- Use java.util.Calendar instead of javax.xml.datatype.XMLGregorianCalendar for xs:dateTime -->
        <jaxb:javaType name="java.util.Calendar" xmlType="xs:dateTime"
                parseMethod="javax.xml.bind.DatatypeConverter.parseDateTime"
                printMethod="javax.xml.bind.DatatypeConverter.printDateTime" />

        <!-- Force all classes implements Serializable -->
        <xjc:serializable uid="1" />
    </jaxb:globalBindings>

    <!-- Annotate the following classes with XmlRootElement -->
    <jaxb:bindings schemaLocation="schema.xsd" node="/xs:schema">
        <jaxb:bindings node="xs:complexType[@name='user']">
            <annox:annotate>
                <annox:annotate annox:class="javax.xml.bind.annotation.XmlRootElement" name="user" />
            </annox:annotate>
        </jaxb:bindings>
        <jaxb:bindings node="xs:complexType[@name='userList']">
            <annox:annotate>
                <annox:annotate annox:class="javax.xml.bind.annotation.XmlRootElement" name="userList" />
            </annox:annotate>
        </jaxb:bindings>
    </jaxb:bindings>
</jaxb:bindings>

mvn clean install コマンドを使用してビルドを実行します。ビルドが成功する必要があります。生成されたクラスは、target/generated-sources/xjc ディレクトリに配置されます。以下は、生成された User クラスのスニペットです。

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "user", propOrder = {})
@XmlRootElement(name = "user")
public class User implements Serializable, ToString {
    private final static long serialVersionUID = 1L;

    protected Long id;

    @XmlElement(required = true)
    protected String name;

    @XmlElement(required = true, type = String.class)
    @XmlJavaTypeAdapter(Adapter1 .class)
    @XmlSchemaType(name = "dateTime")
    protected Calendar registrationDate;

}

これで完了です。

于 2015-11-27T07:55:05.693 に答える