【问题标题】:ReST Webservices: How to accept a list of parameterReST Webservices:如何接受参数列表
【发布时间】:2016-07-26 16:52:40
【问题描述】:

我有 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();     
}

假设 MyObjects 有一个属性:

public class MyObjects {
   @QueryParam       
   private String name;

   public String getName() {    
       return name;    
   }
}

所以当进行休息调用时: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)

如何编写一个接受 MyObjects 列表的 ReST 方法?

我哪里错了?

【问题讨论】:

  • 好吧,1-您将参数发送为Query Params AFAIK,这只能由@QueryParam 阅读,2-我想如果您想使用@BeanParam@FormParam ...你的方法getList() 应该用@POST 而不是@GET 注释,然后你可以在请求的正文中发送数据。 GET 没有正文,它只通过查询参数发送数据。

标签: java web-services rest


【解决方案1】:

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

@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();     
}

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

【讨论】:

  • 谢谢罗斯,我实际上是新手。所以不确定在哪里使用哪个注释。您能建议我传递对象列表的最佳做法吗?
  • 没问题,正如@Yazan 在他的回答中提到的,听起来你想向服务器发送一堆数据而不是在GET 请求上使用一些查询参数,所以在这种情况下您可能应该使用POSTPUT 方法(因为GET 仅有效地用于检索数据)。使用 Jersey,您可以编写 Java 方法以将您的对象/类类型作为参数而不需要任何注释,并使用 Jackson 将其从 POST 正文中发送的 JSON(或类似)转换。
【解决方案2】:

您可以使用由@MatrixParam 注解表示的矩阵参数列表,如下所示:

@GET
@Path("/foo")  
@Produces(MediaType.APPLICATION_JSON)    
public Response someMethod(@MatrixParam("name") List<String> name,
                           @MatrixParam("age") List<Integer> age) {
    ...
}

使用这种方法,您的 URL 将如下所示:

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

【讨论】:

  • 您好,Cassio,感谢您的回复。罗斯也提到了类似的方法。但是我不明白一件事。 MyObjects 类有两个属性,比如说名字和年龄。 @GET @Path("/getList") @Produces(MediaType.APPLICATION_JSON) public Response myMethod(@QueryParam(value = "item") List&lt;MyObjects&gt; item) { ... } 那么 URL 会是什么样子呢?
  • @RahulDevMishra 看看我更新的答案。但是,我自己没有尝试过这个解决方案。
猜你喜欢
  • 2016-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-22
  • 2021-10-29
  • 2011-02-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多