Manejo de Múltiples Parámetros de Consulta en Jersey


En el servicio web en el que estoy trabajando, necesito implementar un URI con parámetros de consulta que se vean como /stats?store=A&store=B&item=C&item=D

Para desglosarlo, necesito poder usar parámetros de consulta para especificar datos de múltiples/todos los almacenes y datos para múltiples/todos los elementos de esos almacenes. Hasta ahora he podido implementar un argumento de consulta muy bien para extraer datos de elementos, pero estoy perdido en cuanto a cómo implementar más consultas, y parece que no puedo encontrar los recursos que había visto antes en qué trato con esta implementación.

Lo que tengo hasta ahora en mi método es a lo largo de las líneas de

@GET
@Path("stats")
public String methodImCalling(@DefaultValue("All") @QueryParam(value = "item") final String item)
{
    /**Run data using item as variable**/
    return someStringOfData
}

Que funciona bien para un elemento, y devolverá todos los datos si no escribo el parámetro en el URI. Sin embargo, no estoy seguro de cómo manejar más parámetros que este.

Actualización :

He descubierto cómo usar 2 parámetros diferentes simplemente agregando un segundo argumento al método de la siguiente manera:

public String methodImCalling(@DefaultValue("All") @QueryParam(value = "store") final String store,
    @DefaultValue("All") @QueryParam(value = "item") final String item)

La pregunta sigue siendo cómo implementar múltiples valores del mismo parámetro.

Author: ZKSteffel, 2011-05-27

3 answers

Si cambia el tipo de su parámetro de método item de String a una colección como List<String>, debería obtener una colección que contenga todos los valores que está buscando.

@GET
@Path("/foo")
@Produces("text/plain")
public String methodImCalling(@DefaultValue("All") 
                              @QueryParam(value = "item") 
                              final List<String> item) {
   return "values are " + item;
}

La especificación JAX-RS (sección 3.2) dice lo siguiente con respecto a la anotación @QueryParam:

Se admiten los siguientes tipos:
  1. Tipos primitivos
  2. Tipos que tienen un constructor que acepta un único argumento String.
  3. Tipos que tienen un método estático llamado valueOf con un único argumento String.
  4. List<T>, Set<T>, o SortedSet<T> donde T satisface 2 o 3 arriba.
 74
Author: stand,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-27 20:03:24

List<String> items=ui.getQueryParameters().get("item");

Donde ui se declara como miembro en el recurso rest de la siguiente manera:

@Context UriInfo ui;

La desventaja es que no aparece en los argumentos de los métodos en absoluto.

 9
Author: Tal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-08 09:09:34

Algunas libs como axios js usan la notación entre corchetes al enviar una solicitud param de múltiples valores: / stats?store [] = A & store [] = B & item [] = C & item[]=D

Para manejar todos los casos (con o sin corchetes) puede agregar otro parámetro como este:

public String methodImCalling(
  @QueryParam(value = "store") final List<String> store, 
  @QueryParam(value = "store[]") final List<String> storeWithBrackets, 
  @QueryParam(value = "item") final List<String> item,
  @QueryParam(value = "item[]") final List<String> itemWithBrackets) {
...
}

Inspeccionando cada uno de los argumentos comprobando null.

 2
Author: matias.g.rodriguez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-09 19:45:29