2013-03-29 2 views
6

다음과 같은 문제로 며칠 동안 고생하고 있습니다. 저는 저널 메일 링리스트와 네트 전반에 대한 답변을 많이 찾았습니다. 그러나이 특정 질문에 대한 답을 찾을 수 없었습니다. 문제 도메인을 설정 리소스 목록에 대해 생성 된 WADL

...

나는이처럼 보이는 간단한 JAX-RS 자원을 만든 톰캣 7

내부 뉴저지 1.16을 사용하고 있습니다 :

@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의 친절 형식의 컬렉션을 반환됩니다. 내가 말했듯이,

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

거의 완벽한하고, 거기에 문제가있다 :

자동으로 생성 된 WADL http://localhost:8092/rest/application.wadl은 다음과 같습니다 거의 완벽합니다.

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

WADL

/getThingsList<Thing>를 돌려 설명되지 않는다. 대신 xsd0.xsd에있는 단일 요소 thing을 참조하는 것처럼 보입니다. 예를 들어 피드 할 때. wadl2java, 유형이 지정되지 않은 클라이언트를 생성합니다. 어떻게 든이 특정 자원이 목록을 반환하는 것을 나타냅니다 자동 WADL 생성이 가능한 경우

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

같은 내가 가지고 List<Thing> 수동으로 코드에 도착하기 위해 , 뭔가 아는 사람 있나요 특정 유형의 리소스가입니까?

그리고 "ThingList"JAXB-annotated 클래스를 추가로 작성하여 저어지 리소스에 반환하고 싶습니다.

나는 거의 거기 "완벽한"WADL를 생성와 오전

, 그것은

가 대단히 감사합니다 ... 내가 놓친 거지 그냥이 (희망) 작은 조각입니다!

+0

GitHub의 에 전체 예는, 그러나? wsdls에서 목록과 간단한 객체는 거의 같은 방식으로 표현됩니다. – acdcjunior

+0

WSDL에 대한 경험이 거의 없으므로 WSDL과 비교하는 것이 내 마음에 들지 않았습니다. 그래서 당신에게는 좋은 지적이 있습니다. 그것이 어떻게 생겼는지에 관해서는, 나는 그것에 대해서 너무 확신하지 못한다. WSDL에서 무엇을 원할 수 있는지 예를 들어 주시겠습니까? – Svilen

+0

WSDL에서 엔티티 (예 :'Person')는 각 속성에 대해 하나의 요소가있는'xs : complexType'이됩니다. '문자열 이름'과 같은 속성은''처럼 보입니다 ('minOccurs ='0 '' 그것은 선택 필드입니다). 'String [] nicknames'라고하는 속성은''. 보시다시피, 간단한 필드에서리스트로의 유일한 차이점은'maxOccurs = 'unbounded'입니다. – acdcjunior

답변

4

나는 동일한 문제가 발생하여 내 자신의 WADL을 생성하여 해결했습니다. 당신은 높은 수준의 WADL의 개요 프로젝트에

응용 프로그램 doc.xml을 다음 파일을 추가 할 필요가이를 위해

응용 프로그램 grammers 논평.당신의 스키마의 위치를 ​​정의하는 xml

resourcedoc.xml 이것은 maven plugin에 의해 생성되고 응답 엘리먼트 javadoc annotations를 포함하는 저지 클래스를 읽는다.

은 당신의 프로젝트에이 HrWadlGeneratorConfig 클래스를 추가하고 저지 서블릿

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

    }                           

}                            

에 초기화 PARAM으로이 추가 저지 클래스와 @response의 조각입니다. 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> 

여기에 무엇을 (XML) 값을하는 것은 당신이 인용 한 그 라인을위한 최적의 것, 내가 WADL 너무 익숙하지 않다 https://github.com/biemond/JDeveloper12c_12.1.2/tree/master/RestFulOWSM/WebService