2012-01-10 6 views
4

サードパーティのwsdlファイルに基づいてWebサービスを使用することに関して質問があります。wsdlからクライアントを作成するときに@XmlRootElementが見つからない

私は与えられたwsdlをとり、必要な120個以上のJavaファイルを生成しました。このプロセスは、xjcを使用して行われました。 Sping環境では、公開されたサービスのいくつかを呼び出すことによって、私は正常にカップルJUnitテストを作成することができました。

しかし、これらのサービスを正常にテストするためには、生成されたJavaファイルに@XmlRootElementアノテーションを追加する必要がありました。それ が@XmlRootElementが欠落しているので、要素として 『com.beam.services.client.UserGetRequestData:「タイプ をマーシャリングすることができませんでしcom.sun.istack.SAXException2』そうでなければ、私は

を示すエラーが発生します注釈」

です。

私は検索を使い果たしました... wsdlファイルの作成方法や構造については何の支配もありません。 @XmlRootElement注釈が含まれていることを保証するためにJavaファイルを生成するにはどうしたらよいですか?また、上記のエラーを回避するためにクライアントサイドコードを記述することもできますか?

ありがとうございます。

+1

いつものように[this](http://stackoverflow.com/q/819720/250517) –

答えて

1

本当に@XmlRootElementが必要な場合は、タイプが1つの要素に対してのみ使用されている場合は、単純バインディングモードを使用できます。 JAXBにデフォルトでアノテーションが含まれていない理由とシンプルバインディングを使用する方法については、ここで説明します。http://weblogs.java.net/blog/kohsuke/archive/2006/03/why_does_jaxb_p.html もう1つの可能性は、JAXBElementにラップすることです。 objectfactoryには、これらのラップされたオブジェクトを作成するメソッドが含まれている必要があります。

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クリーンインストールコマンド。ビルドは成功する必要があります。生成されるクラスは、target/generated-sources/xjcディレクトリにあります。あなたが行われ

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

} 

:以下は、生成されたUserクラスからの抜粋です!

関連する問題