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)
我的问题是用泽西岛启用它.如果未能找到相关文件,并认为可能是,如果我从改变参数的类型String
来enum
此功能会自动工作,所以我改变了方法签名:
@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)
我在这里错过了什么?提前致谢.
经过几次调查后,我没有在球衣中找到任何填充选项列表的代码。(可能尚不支持某些东西)
因此,您可以实现自己的 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)
归档时间: |
|
查看次数: |
1631 次 |
最近记录: |