2010-09-02 11 views
9

è possibile configurare il metodo GET per leggere il numero variabile di parametri URI e interpretarli come argomento variabile (array) o collezione? So che i parametri di query possono essere letti come elenco/set, ma non posso andare per loro nel mio caso.È possibile configurare il metodo JAX-RS con un numero variabile di parametri URI?

Es .:

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

Grazie in anticipo

risposta

8

Se ho capito bene la tua domanda, l'annotazione @Path può prendere un'espressione regolare per specificare un elenco di componenti percorso. Ad esempio, qualcosa come:

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

C'è un esempio più ampio here.

+0

Grazie, questo è probabilmente il più vicino che riesco anche a che così ora ho solo bisogno di mettere lì regexp che corrisponde numeri e barre per example.com/ws/list/1 o esempio.com/ws/list/1/2/3/4/5/6 – zeratul021

2

Non sto inviando questa risposta come risposta, poiché si tratta semplicemente di un caso limite su currently accepted answer, che è quello che ho anche usato. Nel mio caso (Jersey 1.19) /list/{taskid:.+} non funzionava per il caso limite di parametri variabili zero. La modifica della RegEx a /list/{taskid:.*} si è occupata di ciò. Vedi anche this article (che sembra applicabile).

Inoltre, su cambiando l'espressione regolare per indicatore di cardinalità per * (invece di +) Ho anche avuto a che fare a livello di codice con il caso di stringhe vuote come avrei tradurre il List<PathSegment> in un List<String> (a passare nel mio DB-accesso codice).

Il motivo per cui sto convertendo da PathSegment a String è che non volevo una classe dal pacchetto javax.ws.rs.core per inquinare il mio codice di accesso ai dati.

Ecco un esempio completo:

@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 ... 
} 
Problemi correlati