2013-02-21 3 views
8

私たちは、自動WADL生成の優れた機能を利用して、RESTfulなAPI実装にJerseyを使用しています。@PathParamからWADLへの可能な値を含める

単なる例として、我々は方法

@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:.*"/> 

属性はnametypesizeすることができ、我々は値を検証するだけでなく、希望を実行時にも生成されたwadlでそれを示すthis documentこのような機能は、いくつかのタグを生成することによってサポートされるべきである<option><param>、i .e。私は次のようなものを期待しています:

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

私の問題はジャージーでそれを有効にすることです。関連する文書を見つけることができなかったと私はStringからenumにパラメータの種類を変更し、おそらく場合は、この機能が自動的に動作することを想定ので、私はにメソッドのシグネチャを変更した場合:

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

public enum Attribute { 
    name, type, size 
} 

ジャージーはまだオプションなしで<param>タグを生成し、パラメータのタイプはまだxs:stringです。

ジャージーのコードで見つけようとしましたが、関連する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

'パブリック列挙:ここ

はそのような何かを、あなたのチェーンに挿入するタイプ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 } 

そしてもちろんのパラメータの<option>要素を追加するサンプルOptionsWadlGenerator、ありますAttribure'は 'public enum Attribute'でなければなりません...あなたのコードからコピーされたのでしょうか? –

+0

@martinjakubik、確かにタイプミスでした。ありがとうございました。私は投稿を編集してこのミスを修正しました。 – AlexR

答えて

2

。(はまだがサポートされていない、おそらく何か)

だから、あなたがあなた自身のWadlGeneratorを実装し、それを挿入することができます発電機チェーン。

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

ありがとうございました。私はまた、この機能への言及は見ませんでしたが、それはおそらく、何らかの形で反射によって呼び出されたものと思われます。 – AlexR

+0

'WadlGenerator'の実装者はほんのわずかで、' createParam() 'はあまり洗練されていないので、ゲッターへの参照がないとオプションリストは無視されます。 – zagyi