Можно ли настроить метод JAX-RS с переменным количеством параметров URI? - PullRequest
10 голосов
/ 02 сентября 2010

возможно ли настроить метод GET для чтения переменного числа параметров URI и интерпретировать их как переменный аргумент (массив) или коллекцию?Я знаю, что параметры запроса можно прочитать как список / набор, но я не могу использовать их в моем случае.

Например:

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

Заранее спасибо

Ответы [ 2 ]

9 голосов
/ 03 сентября 2010

Если я правильно понимаю ваш вопрос, аннотация @Path может принимать регулярное выражение для указания списка компонентов пути.Например, что-то вроде:

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

Более подробный пример здесь .

3 голосов
/ 20 мая 2016

Я не представляю это как ответ, поскольку это просто крайний случай принятого в настоящее время ответа , который я также использовал.В моем случае (Джерси 1.19) /list/{taskid:.+} не будет работать для крайнего случая параметров с нулевой переменной.Изменение RegEx на /list/{taskid:.*} позаботилось об этом.См. Также эту статью (что, по-видимому, применимо).

Более того, после изменения показателя регулярного выражения в кардинальности на * (вместо +) мне также пришлось работать программнов случае пустых строк, как я бы перевел List<PathSegment> в List<String> (чтобы передать его в мой код доступа к БД).

Причина, по которой я перевожу с PathSegment на Stringявляется то, что я не хотел, чтобы класс из пакета javax.ws.rs.core загрязнил мой код уровня доступа к данным.

Вот полный пример:

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