Java 接受列表作为使用多部分内容类型的Jersey Web服务的参数
我有一个现有的Jersey webservice方法,该方法通过Http POST方法接受许多参数,该方法设计用于处理标准表单数据、应用程序的内容类型/x-www-form-urlencoded;其中一个参数是字符串列表。下面是我拥有的方法签名的一个示例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,
@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为了解决这个问题,我刚刚改变了我的方法,用逗号分隔的字符串来代替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,