2016-06-22 14 views
0

Ich habe folgende Java REST-Methode I mit Jersey implementiert:Array als QueryParam nicht in POST verarbeitet werden

@POST 
@Path("copy") 
public List<Integer> copyCompanionTextRule(@QueryParam("ruleid") List<Integer> ruleIdList, 
              @QueryParam("workgroupid") List<WorkgroupId> workgroupIds, 
              @Context HttpHeaders hh) 
throws ETMSException 
{ 
    List<Integer> insertedItems = new ArrayList<Integer>(); 
    if (null != ruleIdList){ 
     for(Integer ruleId : ruleIdList) { 
      insertedItems.addAll(copyCompanionTextRule(ruleId, workgroupIds)); 
     } 
    } 
    return insertedItems; 
} 

Es erhält eine Liste von Integer und eine Liste von Objekten des Typs WorkgroupId sowie Kontext für etwas zusätzliche Verarbeitung werde ich später tun.

arbeite ich den Client mit Sencha EXTJS 4.2 und meine Anfrage durchgeführt wird, auf diese Weise:

Ext.Ajax.request({ 
      url: '/sysadmin/companiontextrules/copy', 
      method: 'POST', 
      showException: true, 
      scope: this, 
      params: { 
       ruleid: Ext.encode(ruleIdsArray), 
       workgroupid: toWorkgroups 
      }, 
      callback: function(options, success, response) { 
       me.setLoading(false); 

       if (!success) { 
        return; 
       } 
       this.destroy();  
      } 
     }); 

Die ruleIdsArray ist nur ein Array von ganzen Zahlen: [1274,1292,1745]. Die toWorkgroups ist ein Array von Objekten mit einem Modell, das sich auf die Entität WorkgroupId bezieht.

Wie Sie sehen können, werden beide Listen als Abfrageparameter verarbeitet und ich verwende die Konfiguration "params" in der Ajax-Anfrage; Dies funktioniert jedoch nicht.

Scheint wie das RegelId-Array ist leer, wenn es versucht, die Regeln zu durchlaufenIdList ist leer, so dass die Methode POST funktioniert, aber es immer eine leere Liste zurückgibt.

Ich weiß, ich kann sie nicht in der Form "url? Ruleid = a & workgroupid = b" verwenden. Als ich es nur aus Neugierde versuchte, bekam ich eine QueryParamException und eine NumberFormatException, die besagten, dass das Regel-Array als String betrachtet wird.

Wenn ich den "Ext.encode" für beide Parameter verwende, erhalte ich eine Meldung in der Browser-Konsole, dass die maximale Callstack-Größe überschritten wurde.

Das ist, was ich von Chrome-Konsole bekam:

enter image description here

ich fast alles versucht haben, aber vielleicht ein paar mehr Augen kann mir dabei helfen, würde ich wirklich zu schätzen, Kommentare oder irgendeine Art von Hilfe.

Vielen Dank im Voraus.

Antwort

2

Sieht aus wie Ihre Parameter in den POST-Text statt als Abfrageparameter gehen.

url? Ruleid = a & workgroupid = b erhält eine NumberFormatException, weil ruleId Integer sein soll.

url? Ruleid = 1 & workgroupid = b oder url? Ruleid = 1 & ruleid = 2 & workgroupid = b sollte

arbeiten
+0

Ich dachte, dass ExtJS einige Mechanismus o Griff Abfrage params durch die "params" config hat. Ich habe mir einen Code in der Anwendung angeschaut und festgestellt, dass die "params" -Konfiguration von einigen Entwicklern benutzt wird, wenn die Methode GET ist. Für die POST habe ich es so gemacht, wie Sie es vorgeschlagen haben und es hat gut funktioniert. Das Array kann groß sein, also müsste ich wahrscheinlich einen anderen Weg suchen, um damit umzugehen, ich möchte keine sehr umfangreichen URLs. Vielen Dank! –