8

自動WADL生成の優れた機能を利用して、RESTfulAPIの実装にJerseyを使用しています。

例として、メソッドがあります

@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に表示する必要があります。このドキュメント<option>によると、このような機能は、内部にいくつかのタグを生成することでサポートされる必要があります<param>。つまり、次のようなものを期待しています。

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

私の問題は、Jerseyでそれを有効にすることです。関連するドキュメントが見つからず、パラメータのタイプをからに変更すると、この機能が自動的に機能すると想定した場合はStringenumメソッドのシグネチャを次のように変更しました。

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

どこ

public enum Attribute {
    name, type, size
}

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

私はそれをJerseyのコードで見つけようとしcom.sun.research.ws.wadl.Option、関連するJAXBアノテーションを持つクラスを見つけたので、関連しているように見えますが、それを機能させる方法がわかりません。問題はにあると思いWadlGeneratorConfigます。

これが私たちのジャージー定義の関連部分です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>

OurWADLGeneratorコードは次のとおりです。

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

ここで何が欠けていますか?前もって感謝します。

4

2 に答える 2

3

の使用法をすばやく検索するとcom.sun.research.ws.wadl.Param.getOption()(結果はこちらを参照)、実際にはライブラリから呼び出されていないことがわかります。これらのクラスは xjc によって wadl.xsd から生成されるため、そこにあるだけだと思います。Jersey は基本的に wadl ファイル内のこの情報を無視しており、同様に、Jersey が生成する wadl ファイルに含めることを気にしていないようです。

数年前、利用可能なツールが非常に貧弱だったため、wadl を生成する独自のコードを作成することになりました。これはその後変更された可能性がありますが、上記の問題は、wadl の適切なサポートがまだ十分でないことを示しています。:(

于 2013-02-21T17:49:42.883 に答える
2

いくつかの調査の結果、オプションリストが入力されているジャージのコードは見つかりませんでした。(おそらくまだサポートされていないもの)

したがって、独自のWadlGeneratorを実装し、ジェネレータチェーンを挿入することができます。

これは、タイプのパラメーターの要素をOptionsWadlGenerator追加するサンプルです。<option>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();
    }
}
于 2013-03-02T16:14:11.653 に答える