2013-03-29 24 views
6

Tôi đang gặp khó khăn trong một vài ngày với vấn đề sau. Tôi đã tìm kiếm khá nhiều câu trả lời, ở đây trong SO, trong danh sách gửi thư jersey và mạng nói chung, nhưng không thể tìm thấy câu trả lời cho câu hỏi cụ thể này.WADL đã tạo cho Danh sách tài nguyên

Thiết lập miền vấn đề ...

Tôi đang sử dụng Jersey 1.16 bên Tomcat 7.

Tôi đã tạo ra một nguồn lực JAX-RS đơn giản như thế này:

@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 là một POJO được chú thích JAXB trông giống như thế này

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

Tôi cũng đã định cấu hình WadlGeneratorJAXBGrammarGenerator.class

Và khi tôi yêu cầu GET http://localhost:8092/rest, nó hoạt động như một bộ sưu tập có định dạng độc đáo - Thing được trả lại.

sẽ tự động tạo ra WADL http://localhost:8092/rest/application.wadl là gần như hoàn hảo, nó trông như thế này:

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

Như tôi đã nói, gần như hoàn hảo, và nằm trong đó vấn đề.

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

WADL không mô tả rằng /getThings trả về List<Thing>. Thay vào đó, có vẻ như nó đang đề cập đến một phần tử đơn lẻ thing trong xsd0.xsd. Vì vậy, khi tôi cho nó ăn, ví dụ: wadl2java, nó tạo ra khách hàng chưa được phân loại. Để có được một List<Thing> tôi phải tự mã hóa nó, một cái gì đó giống như

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

Có ai biết nếu nó có thể có tự động tạo ra WADL rằng bằng cách nào đó sẽ chỉ ra rằng tài nguyên đặc biệt này đang trở lại một danh sách tài nguyên của một loại cụ thể?

Và tôi không muốn tạo thêm "ThingList" JAXB-chú thích lớp và trả về thay vì trong tài nguyên jersey của tôi.

Tôi gần như ở đó với việc tạo ra những "hoàn hảo" WADL, nó chỉ là này (hy vọng) ít mảnh mà tôi đang thiếu ...

Cảm ơn bạn rất nhiều!

+0

Tôi không quá quen thuộc với wadl, nhưng, những gì giá trị (XML) sẽ được tối ưu cho dòng bạn trích dẫn? Trong các wsdls, các danh sách và các đối tượng đơn giản được biểu diễn gần như giống nhau. – acdcjunior

+0

Nó không đến với tâm trí của tôi để so sánh với WSDL như là một vấn đề của thực tế kể từ khi tôi đã gần như không có kinh nghiệm với nó. Vì vậy, bạn có một điểm tốt. Đối với những gì nó sẽ như thế nào, tôi không quá chắc chắn về điều đó một trong hai. Có lẽ bạn có thể đưa ra một ví dụ về những gì nó muốn trong WSDL? – Svilen

+0

Trong một WSDL, một thực thể (nói 'Person') trở thành một' xs: complexType' với một phần tử cho mỗi thuộc tính mà nó có. Một thuộc tính, nói 'String name', trông giống như' '(' minOccurs = '0'' ngụ ý rằng đó là một trường tùy chọn). Một thuộc tính là một danh sách, nói rằng 'String [] biệt danh' sẽ trở thành một cái gì đó như:' '. Như bạn có thể thấy, sự khác biệt duy nhất từ ​​một trường đơn giản đến một danh sách là 'maxOccurs = 'unbounded''. – acdcjunior

Trả lời

4

Tôi gặp vấn đề tương tự và đã giải quyết vấn đề bằng cách tạo WADL của riêng tôi.

Đối với điều này bạn cần phải thêm các tập tin sau đây để dự án của bạn

ứng dụng doc.xml cho cấp cao tổng quan WADL bình luận

ứng dụng grammers.xml xác định vị trí của lược đồ của bạn (với các yếu tố và điều phức tạp của bạn)

resourcedoc.xml, nó được tạo ra bởi một plugin maven và nó đọc các lớp học của bạn chứa chú thích javadoc.

chỉ cần thêm lớp HrWadlGeneratorConfig này để dự án của bạn và thêm này như init param đến jersey servlet

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

Lớp

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();                   

    }                           

}                            

Dưới đây là một đoạn của lớp Jersey và @response. đại diện.200.qname trỏ đến phần tử trong schema.xsd của riêng bạn

/** 
    * 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(); 
    } 

và pom maven tạo ra tệp resourcedoc.xml mà chúng ta sử dụng bởi trình tạo WADL.

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

đây là ví dụ đầy đủ về github https://github.com/biemond/JDeveloper12c_12.1.2/tree/master/RestFulOWSM/WebService

Các vấn đề liên quan