2010-09-02 6 views
9

ist es möglich, die GET-Methode so zu konfigurieren, dass sie eine variable Anzahl von URI-Parametern liest und sie entweder als variables Argument (Array) oder als Sammlung interpretiert? Ich weiß, Abfrageparameter können als Liste/Set gelesen werden, aber ich kann nicht für sie in meinem Fall gehen.Kann die JAX-RS-Methode mit einer variablen Anzahl von URI-Parametern konfiguriert werden?

Z. B .:

@GET 
@Produces("text/xml") 
@Path("list/{taskId}") 
public String getTaskCheckLists(@PathParam("taskId") int... taskId) { 
    return Arrays.toString(taskId); 
} 

Vielen Dank im Voraus

Antwort

8

Wenn ich Ihre Frage richtig verstanden hat, die @Path Anmerkung kann einen regulären Ausdruck nimmt eine Liste von Pfadkomponenten zu spezifizieren. Zum Beispiel so etwas wie:

@GET 
@Path("/list/{taskid:.+}") 
public String getTaskCheckLists(@PathParam("taskid") List<PathSegment> taskIdList) { 
    ...... 
} 

Es gibt ein ausführlicheres Beispiel here.

+0

Danke, das ist wahrscheinlich die nächste, die ich so jetzt, dass bekommen, ich muss nur dort regexp setzen, die Zahlen übereinstimmt und schlitzt für example.com/ws/list/1 oder example.com/ws/list/1/2/3/4/5/6 – zeratul021

2

Ich reiche dies nicht als Antwort ein, da es nur ein Randfall auf dem currently accepted answer ist, was ich auch benutzt habe. In meinem Fall (Jersey 1.19) /list/{taskid:.+} würde nicht für den Rand Fall der Variablen Null Parameter funktionieren. Die Änderung der RegEx zu /list/{taskid:.*} hat sich darum gekümmert. Siehe auch this article (scheint zutreffend zu sein).

Außerdem, auf den regulären Ausdruck zu Mächtigkeit Indikatoren * zu wechseln (statt +) Ich hatte auch programmatisch mit dem Fall von leeren Saiten zu behandeln, wie ich die List<PathSegment> in ein List<String> übersetzen würde (zu übergeben es in meinen DB-Zugang Code).

Der Grund, warum ich PathSegment-String bin zu übersetzen ist, dass ich nicht eine Klasse aus dem javax.ws.rs.core Paket wollte meine Data Access Layer Code verschmutzen.

Hier ist ein komplettes Beispiel:

@Path("/listDirs/{dirs:.*}") 
@GET 
@Produces(MediaType.APPLICATION_JSON) 
public Response listDirs(@PathParam("dirs") List<PathSegment> pathSegments) { 
    List<String> dirs = new ArrayList<>(); 
    for (PathSegment pathSegment: pathSegments) { 
     String path = pathSegment.getPath(); 
     if ((path!=null) && (!path.trim().equals(""))) 
      dirs.add(pathSegment.getPath()); 
    } 
    List<String> valueFromDB = db.doSomeQuery(dirs); 
    // construct JSON response object ... 
}