2016-03-02 70 views
1

我有休息方法,它應該接受一個對象列表。 我嘗試這樣做:ReST Webservices:如何接受參數列表

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

所以,當進行REST調用:本地主機/ restservice /的GetList名稱= A &名= 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方法?

我在哪裏出錯了?

+0

很好,1-你發送的參數是'Query Params' AFAIK這隻能被'@ QueryParam'讀取,2-我認爲如果你想使用'@ BeanParam'或'@ FormParam' ...你的方法'getList()'應該用'@ POST'而不是'@ GET'註釋,然後你可以在請求的主體中發送數據。 ** GET **沒有正文,它只通過Query Params發送數據。 – Yazan

回答

0

你應該能夠在方法列表中指定查詢參數:

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

的問題很可能是由於在該方法中使用的豆QueryParamBeanParam。如果你想傳遞一堆對象作爲查詢參數(這似乎是一個壞主意),你必須將它們設置爲根據String來創建 - 僅僅是查詢參數的表示。

+0

謝謝羅斯,我其實是新手。所以不知道在哪裏使用哪個註釋。你能建議我傳遞一個對象列表的最佳做法嗎? –

+0

沒問題,就像@Yazan在他的回答中提到的那樣,聽起來你想發送一堆數據給服務器,而不是在GET請求中使用一些查詢參數,所以在這種情況下,你應該使用'POST ''或'PUT'方法(因爲'GET'只用於檢索數據)。使用Jersey,您可以直接編寫Java方法,將對象/類類型作爲參數,而無需任何註釋,並使用Jackson將其從「POST」主體中發送的JSON(或類似)轉換而來。 –

0

可以使用的矩陣參數列表,由@MatrixParam註釋表示,如下:

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

使用這種方法,您的網址將是這樣的:

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

嗨Cassio,謝謝你的回覆。羅斯也提到了一個類似的方法。但是我不明白一件事。 MyObjects類有兩個屬性,可以說名稱和年齡。 '@GET @Path( 「/的GetList」) @Produces(MediaType.APPLICATION_JSON) 公共響應myMethod的(@QueryParam(值= 「項目」)列表項目){ ... }' 那麼URL將如何顯示? –

+0

@RahulDevMishra看看我更新的答案。但是,我自己並沒有嘗試過這個解決方案。 –

+0

@RahulDevMishra你試過這個嗎? –