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

Foi útil?

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 ...
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top