Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 包括@PathParam到WADL的可能值_Java_Rest_Jersey_Wadl - Fatal编程技术网

Java 包括@PathParam到WADL的可能值

Java 包括@PathParam到WADL的可能值,java,rest,jersey,wadl,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中生成以下片段:

我们使用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:.*"/>
我的问题是用Jersey启用它。如果找不到相关文档,并假设如果我将参数类型从
String
更改为
enum
,此功能将自动工作,因此我将方法签名更改为:

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

但是Jersey仍然生成没有选项的
标记,参数类型仍然是
xs:string

我试图在Jersey的代码中找到它,并找到带有相关JAXB注释的类
com.sun.research.ws.wadl.Option
,因此它似乎是相关的,但我不知道如何使它工作。我想问题出在
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>
我错过了什么?
提前谢谢

快速搜索
com.sun.research.ws.wadl.Param.getOption()
(请参见结果)的用法,可以发现它实际上从未从库中调用过。我想这只是因为这些类是由xjc从wadl.xsd生成的。Jersey似乎基本上忽略了wadl文件中的这段信息,同样也不关心将其包含在它生成的wadl文件中


几年前,由于可用的工具太差,我们最终编写了自己的代码来生成wadl。从那时起,这种情况可能已经发生了变化,但上述问题表明,对wadl的适当支持仍然不够(

经过几次调查后,我在jersey没有找到任何填充选项列表的代码。(可能是一些尚不受支持的代码)

因此,您可以实现自己的WadlGenerator并将其插入生成器链

下面是一个示例
选项WADLGenerator
为类型为
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();
    }
}
public类OurWADLGenerator扩展了WadlGeneratorConfig{
@凌驾
公共列表配置(){
返回生成器(WadlGeneratorApplicationDoc.class)
.prop(“applicationDocsStream”、“application doc.xml”)
.generator(WADLGeneratorResourceDocumentSupport.class)
.prop(“resourceDocStream”、“resourcedoc.xml”)
.generator(选项WADLGenerator.class).descriptions();
}
}

感谢您的努力。我也没有看到任何对该功能的引用,但我认为它可能是通过反射以某种方式间接调用的。
WadlGenerator
createParam()的实现者寥寥无几
在其中任何一个方面都不是很复杂,所以我刚刚得出结论,如果没有对其getter的引用,那么选项列表将被忽略。
public enum Attribure
应该是
public enum Attribute
…它是从您的代码复制的还是仅仅是一个输入错误?@martinjakubik,当然是输入错误。谢谢。我刚刚编辑了这篇文章并修复了它这个错误。
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();
    }
}
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();
    }
}