2013-03-29 83 views
6

我現在掙扎了幾天,現在遇到了以下問題。我搜索了很多答案,在這裏,在球衣郵寄名單和一般的網絡中,但無法找到這個問題的答案。資源列表生成的WADL

設置問題域...

我使用 澤西1.16 Tomcat的內部7.

我創建了一個簡單的JAX-RS資源看起來像這樣:

@Path("/") 
@Produces({ "application/xml", "text/plain" }) 
public class ExampleResource { 

    @GET 
    public List<Thing> getThings() { 
     List<Thing> list = new ArrayList<>(); 
     list.add(new Thing("a thing 1", "a thing description 1")); 
     list.add(new Thing("a thing 2", "a thing description 2")); 

     return list; 
    } 

} 

Thing是JAXB帶註釋的POJO,看起來像這樣

 @XmlRootElement(name = "thing") 
     public class Thing { 
      private String name;   
      private String description; 
// getters, setters and @XmlElement annotations ommited for brevity 

我也配置WadlGeneratorJAXBGrammarGenerator.class

當我問GET http://localhost:8092/rest它就像一個魅力 - 返回的Thing很好地格式化集合。

自動生成WADL http://localhost:8092/rest/application.wadl幾乎是完美的,它看起來像這樣:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<application xmlns="http://wadl.dev.java.net/2009/02"> 
    <doc xmlns:jersey="http://jersey.java.net/" jersey:generatedBy="Jersey: 1.16 11/28/2012 02:09 PM" /> 
    <grammars> 
     <include href="application.wadl/xsd0.xsd"> 
      <doc title="Generated" xml:lang="en" /> 
     </include> 
    </grammars> 
    <resources base="http://localhost:8092/rest/"> 
     <resource path="/"> 
      <method id="getThings" name="GET"> 
       <response> 
        <ns2:representation xmlns:ns2="http://wadl.dev.java.net/2009/02" 
         xmlns="" element="thing" mediaType="application/xml" /> 
        <representation mediaType="text/plain" /> 
       </response> 
      </method> 
     </resource> 
    </resources> 
</application> 

就像我說的,近乎完美,這其中就有問題。

<ns2:representation xmlns:ns2="http://wadl.dev.java.net/2009/02" 
          xmlns="" element="thing" mediaType="application/xml" /> 

的WADL不描述該/getThings返回List<Thing>。 相反,它看起來像是指xsd0.xsd中的單個元素thing。 因此,當我用例如wadl2java,它會生成無類型的客戶端。 爲了得到一個List<Thing>我必須手動代碼時,像

List<Thing> asXml = root().getAsXml(new GenericType<List<Thing>>(){});

有誰知道是否有可能具備自動WADL一代人會以某種方式表明,這種特殊的資源返回列表特定類型的資源?

而我不要想要創建額外的「ThingList」JAXB註釋類,並返回,而不是在我的球衣資源。

我幾乎沒有與產生「完美」 WADL,它只是這個(希望)小,我缺少的部分...

非常感謝您!

+0

我不是太熟悉的WADL完整的例子,但是,什麼(XML)值將是最佳爲你報這條線?在wsdls中,列表和簡單對象幾乎以相同的方式表示。 – acdcjunior

+0

因爲我幾乎沒有使用WSDL的經驗,所以我沒有想到將其與WSDL進行比較。所以你有一個好點。至於它應該是什麼樣子,我也不太確定。您是否可以舉一個例子來說明WSDL中的內容? – Svilen

+0

在一個WSDL中,一個實體(比如'Person')變成了一個'xs:complexType',每個屬性都有一個元素。一個屬性,比如'String name',看起來像''('minOccurs ='0'意味着它是一個可選字段)。一個屬性是一個列表,比如'String [] nicknames'會變成如下形式:' acdcjunior

回答

4

我得到了同樣的問題,並通過生成我自己的WADL來解決它。

爲此,您需要將以下文件添加到您的項目

應用doc.xml高水平WADL概述評論

應用grammers。xml它定義了你的模式的位置(包括你的事物和事物元素和複雜類型)

resourcedoc.xml,這是由一個maven插件生成的,它讀取你的澤西類,它包含你的響應元素javadoc註釋。

只需添加這HrWadlGeneratorConfig類項目和初始參數添加這球衣的servlet

<init-param> 
     <param-name>com.sun.jersey.config.property.WadlGeneratorConfig</param-name> 
     <param-value>nl.amis.hr.wadl.HrWadlGeneratorConfig</param-value> 
    </init-param> 

package nl.amis.hr.wadl;                       

import com.sun.jersey.api.wadl.config.WadlGeneratorConfig;              
import com.sun.jersey.api.wadl.config.WadlGeneratorDescription;             
import com.sun.jersey.server.wadl.generators.WadlGeneratorApplicationDoc;          
import com.sun.jersey.server.wadl.generators.WadlGeneratorGrammarsSupport;          
import com.sun.jersey.server.wadl.generators.resourcedoc.WadlGeneratorResourceDocSupport;      
import com.sun.research.ws.wadl.Grammars;                  
import com.sun.research.ws.wadl.Include;                   
import com.sun.research.ws.wadl.ObjectFactory;                 

import java.util.List;                       

public class HrWadlGeneratorConfig extends WadlGeneratorConfig {             

    @Override                         
    public List<WadlGeneratorDescription> configure() {               
     ObjectFactory obj = new ObjectFactory() ;                
     Grammars gram = obj.createGrammars();                 
     Include e = obj.createInclude();                   
     e.setHref("schema.xsd");                     
     gram.getInclude().add(e);                    

     WadlGeneratorConfigDescriptionBuilder builder = generator(WadlGeneratorApplicationDoc.class)    
     .prop("applicationDocsStream", "application-doc.xml")             
     .generator(WadlGeneratorGrammarsSupport.class)               
     .prop("grammarsStream", "application-grammars.xml")             
     .generator(WadlGeneratorResourceDocSupport.class)              
     .prop("resourceDocStream", "resourcedoc.xml");               

     return builder.descriptions();                   

    }                           

}                            

這裏是澤西類和@應答的片段。 representation.200.qname指向您自己的schema中的元素.xsd

/** 
    * Returns the item if existing. 
    * 
    * @response.representation.200.qname employees 
    * @response.representation.200.mediaType application/xml,application/json 
    * @response.representation.200.doc This is the representation returned by default 
    * @response.representation.200.example {@link EmployeeExample#SAMPLE_ITEM} 
    * 
    * 
    * @return the requested item if this service is available 
    */ 
    @GET 
    public List<Employee> getEmployees() { 
    return hrBean.getEmployeesFindAll(); 
    } 

和生成我們將由WADL生成器使用的resourcedoc.xml的maven pom。

<pluginManagement> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-javadoc-plugin</artifactId> 
       <version>2.4</version> 
      </plugin> 
     </plugins> 
    </pluginManagement>                             

     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-javadoc-plugin</artifactId> 
      <executions> 
       <execution> 
        <goals> 
         <goal>javadoc</goal> 
        </goals> 
        <phase>compile</phase> 
       </execution> 
      </executions> 
      <configuration> 
       <encoding>UTF-8</encoding> 
       <verbose>false</verbose> 
       <show>public</show> 
       <subpackages>nl.amis.hr.restful</subpackages> 
       <doclet>com.sun.jersey.wadl.resourcedoc.ResourceDoclet</doclet> 
        <docletPath>${path.separator}${project.build.outputDirectory}</docletPath> 
        <docletArtifacts> 
        <docletArtifact> 
          <groupId>nl.amis.hr</groupId> 
          <artifactId>Model</artifactId> 
          <version>1.0-SNAPSHOT</version> 
        </docletArtifact> 
        <docletArtifact> 
         <groupId>com.sun.jersey.contribs</groupId> 
         <artifactId>wadl-resourcedoc-doclet</artifactId> 
         <version>1.17.1</version> 
        </docletArtifact> 
        <docletArtifact> 
         <groupId>com.sun.jersey</groupId> 
         <artifactId>jersey-server</artifactId> 
         <version>1.17.1</version> 
        </docletArtifact> 
        <docletArtifact> 
         <groupId>xerces</groupId> 
         <artifactId>xercesImpl</artifactId> 
         <version>2.6.1</version> 
        </docletArtifact> 
       </docletArtifacts> 
       <!-- the following option is required as a work around for 
        version 2.5 of the javadoc plugin which will be used 
        by a maven version > 2.0.9 --> 
       <useStandardDocletOptions>false</useStandardDocletOptions> 
       <additionalparam>-output ${project.build.outputDirectory}/resourcedoc.xml</additionalparam> 
      </configuration> 
     </plugin> 

這裏是在github https://github.com/biemond/JDeveloper12c_12.1.2/tree/master/RestFulOWSM/WebService