将@PathParam的可能值包含到WADL中

Ale*_*exR 8 java rest jersey wadl

我们使用Jersey来实现RESTful API,利用其自动WADL生成的强大功能.

举个例子,我们有方法

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

这会在WADL中生成以下片段:

<param type="xs:string" style="template" name="attribute:.*"/>
Run Code Online (Sandbox Code Playgroud)

属性可以是name,type,size我们希望不只是为了确认在运行时的值,但也表明它在生成WADL根据这份文件这样的功能应通过生成的多个变量来支持<option>内部<param>,也就是我期待像下面这样:

<param type="aws:Attributes" style="template" name="attribute">
  <option value="name"/> 
  <option value="type"/> 
  <option value="size"/> 
</param>
Run Code Online (Sandbox Code Playgroud)

我的问题是用泽西岛启用它.如果未能找到相关文件,并认为可能是,如果我从改变参数的类型Stringenum此功能会自动工作,所以我改变了方法签名:

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

哪里

public enum Attribute {
    name, type, size
}
Run Code Online (Sandbox Code Playgroud)

但泽西岛仍然生成<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>
Run Code Online (Sandbox Code Playgroud)

其中,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();
    }
}
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么?提前致谢.

ben*_*n75 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    
}
Run Code Online (Sandbox Code Playgroud)

当然,要将其插入到您的链中,请执行以下操作:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)