Java RESTWebServices:如何接受参数列表

Java RESTWebServices:如何接受参数列表,java,web-services,rest,Java,Web Services,Rest,我有一个rest方法,它应该接受一个对象列表。 我试过这个: @GET @Path("/getList") @Produces(MediaType.APPLICATION_JSON) public response getList(@BeanParam List<MyObjects> myobjectsList) { //Iterate over the list and return return Response.o

我有一个rest方法,它应该接受一个对象列表。 我试过这个:

@GET     
@Path("/getList")     
@Produces(MediaType.APPLICATION_JSON)    
public response getList(@BeanParam List<MyObjects> myobjectsList) {          
//Iterate over the list and return        
return Response.ok(outputList).build();     
}
所以当进行rest调用时:localhost/restservice/getList?name=a&name=B 我得到以下例外情况:

Message:A MultiException has 2 exceptions.  They are:
1. java.lang.NoSuchMethodException: Could not find a suitable constructor in java.util.List class.
2. java.lang.IllegalArgumentException: Errors were discovered while reifying SystemDescriptor(
    implementation=java.util.List
    contracts={java.util.List}
    scope=org.glassfish.jersey.process.internal.RequestScoped
    qualifiers={}
    descriptorType=CLASS
    descriptorVisibility=NORMAL
    metadata=
    rank=0
    loader=null
    proxiable=null
    proxyForSameScope=null
    analysisName=null
    id=349
    locatorId=0
    identityHashCode=1585683969
    reified=false)
MultiException stack 1 of 2
java.lang.NoSuchMethodException: Could not find a suitable constructor in java.util.List class.
    at org.glassfish.jersey.internal.inject.JerseyClassAnalyzer.getConstructor(JerseyClassAnalyzer.java:192)
    at org.jvnet.hk2.internal.Utilities.getConstructor(Utilities.java:180)
    at org.jvnet.hk2.internal.ClazzCreator.initialize(ClazzCreator.java:129)
    at org.jvnet.hk2.internal.ClazzCreator.initialize(ClazzCreator.java:182)
    at org.jvnet.hk2.internal.SystemDescriptor.internalReify(SystemDescriptor.java:723)
    at org.jvnet.hk2.internal.SystemDescriptor.reify(SystemDescriptor.java:678)
    at org.jvnet.hk2.internal.ServiceLocatorImpl.reifyDescriptor(ServiceLocatorImpl.java:416)
    at org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2029)
    at org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:105)
    at org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:87)
//more stack trace
MultiException stack 2 of 2
java.lang.IllegalArgumentException: Errors were discovered while reifying SystemDescriptor(
    implementation=java.util.List
    contracts={java.util.List}
    scope=org.glassfish.jersey.process.internal.RequestScoped
    qualifiers={}
    descriptorType=CLASS
    descriptorVisibility=NORMAL
    metadata=
    rank=0
    loader=null
    proxiable=null
    proxyForSameScope=null
    analysisName=null
    id=349
    locatorId=0
    identityHashCode=1585683969
    reified=false)
    at org.jvnet.hk2.internal.SystemDescriptor.reify(SystemDescriptor.java:689)
    at org.jvnet.hk2.internal.ServiceLocatorImpl.reifyDescriptor(ServiceLocatorImpl.java:416)
    at org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2029)
    at org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:105)
    at org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:87)
如何编写一个接受myobject列表的ReST方法


这哪里出了问题?

您应该能够将方法上的查询参数指定为列表:

@GET     
@Path("/getList")     
@Produces(MediaType.APPLICATION_JSON)    
public Response getList(@QueryParam("name") List<String> nameList) {          
    //Iterate over the list and return        
    return Response.ok(nameList).build();     
}
@GET
@路径(“/getList”)
@产生(MediaType.APPLICATION_JSON)
公共响应getList(@QueryParam(“name”)List nameList){
//迭代列表并返回
返回Response.ok(nameList.build();
}

问题可能是由于在bean中使用了
QueryParam
,而在方法上使用了
BeanParam
。如果您想将一组对象作为查询参数传递(这似乎是个坏主意),您必须将它们设置为从
字符串创建,这是查询参数的唯一表示形式。

您应该能够将方法上的查询参数指定为列表:

@GET     
@Path("/getList")     
@Produces(MediaType.APPLICATION_JSON)    
public Response getList(@QueryParam("name") List<String> nameList) {          
    //Iterate over the list and return        
    return Response.ok(nameList).build();     
}
@GET
@路径(“/getList”)
@产生(MediaType.APPLICATION_JSON)
公共响应getList(@QueryParam(“name”)List nameList){
//迭代列表并返回
返回Response.ok(nameList.build();
}

问题可能是由于在bean中使用了
QueryParam
,而在方法上使用了
BeanParam
。如果要将一组对象作为查询参数传递(这似乎是个坏主意),则必须将它们设置为从
字符串创建,该字符串仅表示查询参数。

可以使用由注释表示的矩阵参数列表,如下所示:

@GET
@路径(“/foo”)
@产生(MediaType.APPLICATION_JSON)
公共响应someMethod(@MatrixParam(“名称”)列表名称,
@MatrixParam(“年龄”)列表年龄){
...
}
使用此方法,您的URL将如下所示:

GET /foo;name=John;age=30;name=Jane;age=20

可以使用由注释表示的矩阵参数列表,如下所示:

@GET
@路径(“/foo”)
@产生(MediaType.APPLICATION_JSON)
公共响应someMethod(@MatrixParam(“名称”)列表名称,
@MatrixParam(“年龄”)列表年龄){
...
}
使用此方法,您的URL将如下所示:

GET /foo;name=John;age=30;name=Jane;age=20

好的,1-您正在以
查询参数的形式发送参数,这只能由
@QueryParam
读取,2-我想如果您想使用
@BeanParam
@FormParam
。。。您的方法
getList()
应该用
@POST
而不是
@GET
进行注释,然后您可以在请求的正文中发送数据。GET没有主体,它只通过查询参数发送数据。好吧,1-您将参数作为
查询参数发送,好吧,这只能由
@QueryParam
读取,2-我想如果您想使用
@BeanParam
@FormParam
。。。您的方法
getList()
应该用
@POST
而不是
@GET
进行注释,然后您可以在请求的正文中发送数据。GET没有主体,它只通过查询参数发送数据。谢谢Ross,我对这一点还不熟悉。所以我不确定在哪里使用哪个注释。你能告诉我传递对象列表的最佳实践吗?没问题,正如@Yazan在他的回答中提到的,听起来你想向服务器发送一组数据,而不是在
GET
请求中使用一些查询参数,因此在这种情况下,你可能应该使用
POST
PUT
方法(因为
GET
仅用于检索数据)。使用Jersey,您只需编写Java方法,将对象/类类型作为参数,而不需要任何注释,并使用Jackson将其从JSON(或类似文件)转换发送到
帖子的正文中。谢谢Ross,我实际上是新手。所以我不确定在哪里使用哪个注释。你能建议我传递对象列表的最佳做法吗?没问题,正如@Yazan在回答中提到的,听起来你想向服务器发送一组数据,而不是在服务器上使用一些查询参数
GET
请求,因此在这种情况下,您可能应该使用
POST
PUT
方法(因为
GET
仅用于检索数据)。使用Jersey,您只需编写Java方法,将对象/类类型作为参数,而无需任何注释,并使用Jackson将其从JSON(或类似内容)转换Cassio,谢谢你的回复。Ross也提到了类似的方法。但是我不明白一件事。MyObject类有两个属性,比如名称和年龄。
@GET@Path(“/getList”)@products(MediaType.APPLICATION_JSON)公共响应myMethod(@QueryParam(value=“item”)列表项){…}
那么URL会是什么样子?@RahulDevMishra看看我的更新答案。但是,我自己还没有尝试过这个解决方案。你好,凯西奥,谢谢你的回答。罗斯也提到了类似的方法。但是我不明白一件事。MyObjects类有两个属性,比如name和age。
@GET@Path(/getList”)@products(MediaType.APPLICATION_JSON)public Response myMethod(@QueryParam(value=“item”)List item){…}
那么URL会是什么样子呢?@RahulDevMishra看看我更新的答案。但是,我自己还没有尝试过这个解决方案。