É possível configurar o método JAX-RS com o número variável de parâmetros URI?
-
26-09-2019 - |
Pergunta
É possível configurar o método GET para ler o número variável de parâmetros URI e interpretá -los como argumento variável (matriz) ou coleta? Sei que os parâmetros de consulta podem ser lidos como lista/definição, mas não posso optar por eles no meu caso.
Por exemplo:
@GET
@Produces("text/xml")
@Path("list/{taskId}")
public String getTaskCheckLists(@PathParam("taskId") int... taskId) {
return Arrays.toString(taskId);
}
desde já, obrigado
Solução
Se eu entender sua pergunta corretamente, o @Path
A anotação pode assumir uma expressão regular para especificar uma lista de componentes do caminho. Por exemplo, algo como:
@GET
@Path("/list/{taskid:.+}")
public String getTaskCheckLists(@PathParam("taskid") List<PathSegment> taskIdList) {
......
}
Há um exemplo mais extenso aqui.
Outras dicas
Não estou enviando isso como uma resposta, pois é apenas um caso de borda no resposta atualmente aceita que é o que eu também usei. No meu caso (Jersey 1.19) /list/{taskid:.+}
não funcionaria para o caso de borda de zero parâmetros variáveis. Alterando o regex para /list/{taskid:.*}
cuidou disso. Veja também Este artigo (que parece ser aplicável).
Além disso, ao alterar o regexp para indicador de cardinalidade para *
(ao invés de +
) Eu também tive que lidar programaticamente com o caso de cordas vazias, pois traduziria o List<PathSegment>
dentro de List<String>
(Para passar para o meu código de acesso DB).
A razão pela qual estou traduzindo PathSegment
para String
é que eu não queria uma aula do javax.ws.rs.core
Pacote para poluir meu código de camada de acesso a dados.
Aqui está um exemplo 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 ...
}