Можно ли настроить метод JAX-RS с переменным количеством параметров URI?

StackOverflow https://stackoverflow.com/questions/3629225

Вопрос

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

Например:

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

Причина, по которой я перевод 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 ...
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top