Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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 接受列表作为使用多部分内容类型的Jersey Web服务的参数_Java_Web Services_Jersey_Multipart_Rest Assured - Fatal编程技术网

Java 接受列表作为使用多部分内容类型的Jersey Web服务的参数

Java 接受列表作为使用多部分内容类型的Jersey Web服务的参数,java,web-services,jersey,multipart,rest-assured,Java,Web Services,Jersey,Multipart,Rest Assured,我有一个现有的Jersey webservice方法,该方法通过Http POST方法接受许多参数,该方法设计用于处理标准表单数据、应用程序的内容类型/x-www-form-urlencoded;其中一个参数是字符串列表。下面是我拥有的方法签名的一个示例 @POST @Consumes(MediaType.APPLICATION_FORM_URLENCODED) public Response createItem( @FormParam("p1") long p1,

我有一个现有的Jersey webservice方法,该方法通过Http POST方法接受许多参数,该方法设计用于处理标准表单数据、应用程序的内容类型/x-www-form-urlencoded;其中一个参数是字符串列表。下面是我拥有的方法签名的一个示例

@POST
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public Response createItem(
        @FormParam("p1") long p1,
        @FormParam("p2") String p2,
        @FormParam("p3") List<String> p3,
        @FormParam("p4") String p4,
        @Context UriInfo uriInfo
) throws SQLException {
在Jersey代码中添加了一些断点之后,在堆栈跟踪中标识的一些点上,似乎它已经确定了要调用的正确方法,但是在它试图传递给它的参数列表中,p3被忽略了

在处理多部分数据时,为了支持接受列表作为输入,是否需要执行一些不同的操作? 鉴于这是一个可选参数,我希望无论如何都可以忽略它,原始方法就是这样

用于调用该方法的测试中的重启代码如下所示

Response response = given()                    
                .header("my_header", "xyz")
                .param("p1", "8000040")
                .param("p2", "sample string") 
                .param("p3", "first_value")
                .param("p4", "abcde")
                .multiPart("file", myFile1, inputStream)
                .expect()
我也尝试过在重新发布的测试代码中使用formParam代替param,但得到了相同的结果


提前感谢,如果您有任何帮助,我们将不胜感激。

我已经阅读了更多的jersey代码,我的结论是,在使用multi-part时,我的方法上不能有List类型的参数。 在流程的某一点上,Jersey在com.sun.Jersey.multipart.impl.FormDataMultiPartDispatchProvider类中循环遍历方法上的每个参数,找到一个可注入函数来读取每个参数的值(很抱歉,这可能不是一个很好的解释,但我已经进行了尽可能多的调试) getInjectables方法中包含以下代码:

 private List<Injectable> getInjectables(AbstractResourceMethod method) {
    List<Injectable> list = new ArrayList<Injectable>(method.getParameters().size());
    for (int i = 0; i < method.getParameters().size(); i++) {
        Parameter p = method.getParameters().get(i);
        if (Parameter.Source.ENTITY == p.getSource()) {
            if (FormDataMultiPart.class.isAssignableFrom(p.getParameterClass())) {
                list.add(new FormDataMultiPartInjectable());
            } else {
                list.add(null);
            }
        } else if (p.getAnnotation().annotationType() == FormDataParam.class) {
            if (Collection.class == p.getParameterClass() || List.class == p.getParameterClass()) {
                Class c = ReflectionHelper.getGenericClass(p.getParameterType());
                if (FormDataBodyPart.class == c) {
                    list.add(new ListFormDataBodyPartMultiPartInjectable(p.getSourceName()));
                } else if (FormDataContentDisposition.class == c) {
                    list.add(new ListFormDataContentDispositionMultiPartInjectable(p.getSourceName()));
                }
            } else if (FormDataBodyPart.class == p.getParameterClass()) {
                list.add(new FormDataBodyPartMultiPartInjectable(p.getSourceName()));
            } else if (FormDataContentDisposition.class == p.getParameterClass()) {
                list.add(new FormDataContentDispositionMultiPartInjectable(p.getSourceName()));
            } else {
                list.add(new FormDataMultiPartParamInjectable(p));
            }
        } else {
            Injectable injectable = getInjectableProviderContext().getInjectable(p, ComponentScope.PerRequest);
            list.add(injectable);
        }
    }
    return list;
}
私有列表getInjectables(AbstractResourceMethod){ List List=newarraylist(method.getParameters().size()); 对于(int i=0;i 因此,当它看到参数类型是列表或集合时,当泛型类型不是FormDataCodePart或FormDataContentDisposition时,它将忽略它


为了解决这个问题,我刚刚改变了我的方法,用逗号分隔的字符串来代替p3的列表。

我找到了另一个解决方案,它可能比手动处理逗号分隔的列表版本更好(也更简单)。为了帮助其他人找到这篇文章,发布得太晚了

将multipart参数更改为:

@FormDataParam("p3") List<String> p3,
@FormDataParam(“p3”)列表p3,

@FormDataParam(“p3”)列表p3,
然后在P3中有一个列表,可以使用
getValue()
获取每个
FormDataBodyPart
元素的参数值


来源:

您使用的是什么版本的重新发行?如果>1.5,则在
given()
之后添加
log()
,并查看您的请求。我正在使用重新发行的1.6版。添加了log()之后,请求中似乎传递了p3的值。@rob,你找到解决方法了吗?
 private List<Injectable> getInjectables(AbstractResourceMethod method) {
    List<Injectable> list = new ArrayList<Injectable>(method.getParameters().size());
    for (int i = 0; i < method.getParameters().size(); i++) {
        Parameter p = method.getParameters().get(i);
        if (Parameter.Source.ENTITY == p.getSource()) {
            if (FormDataMultiPart.class.isAssignableFrom(p.getParameterClass())) {
                list.add(new FormDataMultiPartInjectable());
            } else {
                list.add(null);
            }
        } else if (p.getAnnotation().annotationType() == FormDataParam.class) {
            if (Collection.class == p.getParameterClass() || List.class == p.getParameterClass()) {
                Class c = ReflectionHelper.getGenericClass(p.getParameterType());
                if (FormDataBodyPart.class == c) {
                    list.add(new ListFormDataBodyPartMultiPartInjectable(p.getSourceName()));
                } else if (FormDataContentDisposition.class == c) {
                    list.add(new ListFormDataContentDispositionMultiPartInjectable(p.getSourceName()));
                }
            } else if (FormDataBodyPart.class == p.getParameterClass()) {
                list.add(new FormDataBodyPartMultiPartInjectable(p.getSourceName()));
            } else if (FormDataContentDisposition.class == p.getParameterClass()) {
                list.add(new FormDataContentDispositionMultiPartInjectable(p.getSourceName()));
            } else {
                list.add(new FormDataMultiPartParamInjectable(p));
            }
        } else {
            Injectable injectable = getInjectableProviderContext().getInjectable(p, ComponentScope.PerRequest);
            list.add(injectable);
        }
    }
    return list;
}
@FormDataParam("p3") List<String> p3,
@FormDataParam("p3") List<FormDataBodyPart> p3,