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) {
....
}
这会在WADL中生成以下片段:
<param type="xs:string" style="template" name="attribute:.*"/>
属性可以是name,type,size我们希望不只是为了确认在运行时的值,但也表明它在生成WADL根据这份文件这样的功能应通过生成的多个变量来支持<option>内部<param>,也就是我期待像下面这样:
<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.
我试图在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();
    }
}
我在这里错过了什么?提前致谢.
经过几次调查后,我没有在球衣中找到任何填充选项列表的代码。(可能尚不支持某些东西)
因此,您可以实现自己的 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();
    }
}
| 归档时间: | 
 | 
| 查看次数: | 1631 次 | 
| 最近记录: |