2012-01-10 33 views
4

我有一個關於使用基於第三方wsdl文件的Web服務的問題。從wsdl創建客戶端時缺少@XmlRootElement

我已經採用了給定的wsdl並生成了所需的120多個java文件。該過程通過使用xjc完成。在Sping環境中,我通過調用幾個公開的服務成功創建了幾個JUnit測試。

但是,爲了成功測試這些服務,我必須將@XmlRootElement註釋添加到生成的java文件中。因爲它 缺少的@XmlRootElement com.beam.services.client.UserGetRequestData‘爲元素:否則,我會遇到一個錯誤,說明

「不能編組類型 com.sun.istack.SAXException2’註釋「

我用盡了我的搜索......我無法控制wsdl文件是如何創建/結構化的。我該如何去生成java文件以確保包含@XmlRootElement註釋,或者去編寫客戶端代碼以避免上述錯誤?

謝謝。

+1

一如既往 - 參見[this](http://stackoverflow.com/q/819720/250517) – 2012-01-11 06:17:38

回答

1

如果您使用的是mavem,請檢查它爲我工作的鏈接。

創建Maven項目。使用

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

運行構建:下面你可以看到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) 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; 

} 

你完成了!