2013-02-21 5 views
8

자동 WADL 생성의 멋진 기능을 활용하여 RESTful API 구현을 위해 Jersey를 사용하고 있습니다.WADL에 @PathParam의 가능한 값을 포함합니다.

그냥 예를 들어 우리는이 방법

@GET 
@Path("/{id}/{attribute}") 
@Produces(MediaType.APPLICATION_JSON) 
public Object getAttributeByID(@PathParam("id") long id, @PathParam("attribute") String attribute) { 
.... 
} 

이 WADL의 다음 조각 생성

<param type="xs:string" style="template" name="attribute:.*"/> 

특성이 name, type, size 수 있습니다을 우리가 값을 검증 할뿐만 아니라 원하는 런타임에도 생성 된 wadl에서 보여줍니다. this document에 따르면 이러한 기능은 안에 여러 개의 태그를 생성하여 지원해야합니다. <param>, i .합니다 .e 나는 다음과 같은 것을 기대하고있다 :

<param type="aws:Attributes" style="template" name="attribute"> 
    <option value="name"/> 
    <option value="type"/> 
    <option value="size"/> 
</param> 

내 문제는 뉴저지로 수 있도록하는 것입니다.

@Path("/{id}/{attribute}") 
@Produces(MediaType.APPLICATION_JSON) 
public Object getAttributeByID(@PathParam("id") long id, @PathParam("attribute") Attribute attribute) { 
.... 
} 

public enum Attribute { 
    name, type, size 
} 

: 관련 문서를 찾지 못했습니다 내가 String에서 enum에 매개 변수의 유형을 변경 아마도 경우이 기능이 자동으로 작동한다고 가정하면, 그래서에 메소드 서명 변경 그러나 저지는 여전히 옵션없이 <param> 태그를 생성하며 매개 변수 유형은 여전히 ​​xs:string입니다.

Jersey의 코드에서 찾으려고 시도하고 관련 JAXB 주석이있는 com.sun.research.ws.wadl.Option 클래스를 찾았으므로 관련성이있는 것으로 보이지만 작동시키는 법을 모르겠습니다. 문제는 WadlGeneratorConfig에있는 것 같습니다.

public class OurWADLGenerator extends WadlGeneratorConfig { 
    @Override 
    public List<WadlGeneratorDescription> configure() { 
     return generator(WadlGeneratorApplicationDoc.class) 
       .prop("applicationDocsStream", "application-doc.xml") 
      .generator(WadlGeneratorResourceDocSupport.class) 
       .prop("resourceDocStream", "resourcedoc.xml").descriptions(); 
    } 
} 

내가 여기서 무엇을 놓치고 : 여기

는 우리가 OurWADLGenerator 코드가 web.xml

<filter> 
<filter-name>REST-API</filter-name> 
<filter-class>com.sun.jersey.spi.container.servlet.ServletContainer</filter-class> 
    ................ 
<init-param> 
    <param-name>com.sun.jersey.config.property.WadlGeneratorConfig</param-name> 
    <param-value>com.mycompany.resource.OurWADLGenerator</param-value> 
</init-param> 
<init-param> 
    <param-name>com.sun.jersey.config.property.packages</param-name> 
    <param-value>com.mycompany</param-value> 
</init-param> 
</filter> 

에서 뉴저지 정의의 관련 부분입니까? 미리 감사드립니다.

+0

'공공 열거 Attribure'는'public enum Attribute'이어야합니다 ... 당신의 코드 또는 오타에서 복사 되었습니까? –

+0

@martinjakubik, 확실히 오타였습니다. 고맙습니다. 방금 게시물을 수정하고이 실수를 수정했습니다. – AlexR

답변

2

. (아직 지원되지 않습니다 아마 뭔가)

그래서 당신은 당신의 자신의 WadlGenerator을 구현하고 삽입 할 수 있습니다 발전기 체인.여기

유형의 매개 변수에 대한 <option> 요소를 추가 샘플 OptionsWadlGenerator입니다 Enum

package com.mycompany; 

import com.sun.jersey.api.model.AbstractMethod; 
import com.sun.jersey.api.model.AbstractResource; 
import com.sun.jersey.api.model.AbstractResourceMethod; 
import com.sun.jersey.api.model.Parameter; 
import com.sun.jersey.server.wadl.WadlGenerator; 
import com.sun.research.ws.wadl.Application; 
import com.sun.research.ws.wadl.Method; 
import com.sun.research.ws.wadl.ObjectFactory; 
import com.sun.research.ws.wadl.Option; 
import com.sun.research.ws.wadl.Param; 
import com.sun.research.ws.wadl.RepresentationType; 
import com.sun.research.ws.wadl.Request; 
import com.sun.research.ws.wadl.Resource; 
import com.sun.research.ws.wadl.Resources; 
import com.sun.research.ws.wadl.Response; 

import javax.ws.rs.core.MediaType; 

public class OptionsWadlGenerator implements WadlGenerator { 

    private WadlGenerator _delegate; 

    private ObjectFactory objectFactory = new ObjectFactory(); 

    @Override 
    public Param createParam(AbstractResource r, AbstractMethod m, Parameter p) { 
     Param param = _delegate.createParam(r, m, p); 
     if(((Parameter)p).getParameterClass().isEnum()){ 
      Object[] values = p.getParameterClass().getEnumConstants(); 
      for(Object enumItem:values){ 
       Option option = objectFactory.createOption(); 
       option.setValue(((Enum)enumItem).name()); 
       param.getOption().add(option); 
      } 
     } 
     return param; 
    } 

    @Override 
    public void setWadlGeneratorDelegate(WadlGenerator delegate) { 
     this._delegate = delegate; 
    } 

    @Override 
    public Application createApplication() { 
     return _delegate.createApplication(); 
    } 

    ... all other methods also simply call the _delegate equivalent method  
} 

물론, 당신의 체인에 삽입 그런 일 할 수있는 :

public class OurWADLGenerator extends WadlGeneratorConfig { 
    @Override 
    public List<WadlGeneratorDescription> configure() { 
     return generator(WadlGeneratorApplicationDoc.class) 
       .prop("applicationDocsStream", "application-doc.xml") 
      .generator(WadlGeneratorResourceDocSupport.class) 
       .prop("resourceDocStream", "resourcedoc.xml") 
      .generator(OptionsWadlGenerator.class).descriptions(); 
    } 
} 
3

com.sun.research.ws.wadl.Param.getOption() (결과 : here 참조)의 사용법을 빠르게 검색하면 라이브러리에서 실제로 호출되지 않는다는 것을 알 수 있습니다. 나는이 클래스가 wadl.xsd의 xjc에 의해 생성되기 때문에 거기에있는 것 같아요. 저지는 기본적으로 wadl 파일에서이 정보를 무시하고 비슷하게 생성하는 wadl 파일에 포함시키지 않습니다.

몇 년 전에 우리는 wadl을 생성하는 코드를 작성했습니다. 사용 가능한 툴링이 너무 가난했기 때문입니다. 이것은 그 이후로 변경되었을 수도 있지만, 위의 문제는 wadl에 대한 적절한 지원이 아직 상당히 부족하다는 것을 보여줍니다. :(나는 옵션 목록이 채워집니다 저지에 코드를 찾을 수 없습니다 몇 가지 조사 후

+0

감사합니다. 나는 또한이 기능에 대한 어떤 참조도 보지 못했지만 그것이 반영에 의해 어떻게 든 inderictly 호출된다고 생각했다. – AlexR

+0

'WadlGenerator' 구현 자의 수가 적고'createParam()'이 그다지 정교하지 않기 때문에 getter에 대한 참조가 없으면 옵션 목록이 무시된다는 결론을 얻었습니다. – zagyi