Как я могу отобразить разделенные точкой с запятой PathParams в Джерси? - PullRequest
12 голосов
/ 31 марта 2011

Есть ли способ использовать этот параметр стиля:

/ продукты / 123; 456; 789

в JAX-RS с Джерси? Если я использую PathParam, возвращается только первый параметр в списке. Я попытался избежать точки с запятой, но затем Джерси возвращает только «123; 456; 789» в качестве значения первой записи списка параметров

Я объявил метод GET как

public List<Product> getClichedMessage(@PathParam("ids") List<String> idList)

Обновление: я имею в виду руководство пользователя Джерси для Джерси 1.1.5:

В целом тип метода Java параметр может (...) 4) быть списком, Установить или SortedSet, где T удовлетворяет 2 или 3 выше. Результирующий Коллекция доступна только для чтения. (...) Иногда параметры могут содержать больше чем одно значение для того же имени. Если это тот случай, тогда наберите в 4) может использоваться для получения всех значений.

Обновление: вот мой тестовый код:

package de.betabeans.resources;

import java.util.List;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;

@Path("/test")
public class TestResource {

    @GET
    @Path("/{ids}")
    @Produces({"text/plain"})
    public String getClichedMessage(@PathParam("ids") List<String> idList) {
        return "size=" + idList.size();
    }

}

Проверка URL с точкой с запятой: http://localhost:8080/resources/test/1%3B2%3B3

Обновление: журнал изменений для Джерси 1.3 включает эту информацию:

Исправлена ​​ошибка 540
http://java.net/jira/browse/JERSEY-540 Параметризованные типы List / Set / SortedSet поддерживаются для параметры, например @QueryParam ("d") Список>, если есть StringReaderProvider зарегистрирован, который поддерживает тип Список.

Я проверю StringReaderProvider на основе этого поста http://comments.gmane.org/gmane.comp.java.jersey.user/7545

1 Ответ

21 голосов
/ 01 апреля 2011

Когда вы используете точку с запятой, вы создаете Параметры матрицы . Вы можете использовать либо @MatrixParam, либо PathSegment, чтобы получить их. Пример:

 public String get(@PathParam("param") PathSegment pathSegment)

Обратите внимание, что параметры Matrix соответствуют исходным параметрам. Так, в случае «123; 456; 789» - 123 - это параметр пути, а 456 и 789 - имена параметров матрицы.

Итак, если вы хотите получать товары по идентификаторам, вы можете сделать что-то вроде этого:

public List<Product> getClichedMessage(@PathParam("ids") PathSegment pathSegment) {
    Set<String> ids = pathSegment.getMatrixParameters().keySet();
    // continue coding
}

Обратите внимание, что ваш URL должен быть /products/ids;123;456;789

На самом деле, IMO - это не очень хороший дизайн: вы используете имя параметра матрицы в качестве значения. Я думаю, что лучше использовать параметры запроса: /products?id=123&id=456&id=789, поэтому вы можете легко получить их в методе:

public List<Product> getClichedMessage(@QueryParam("id") List<String> ids)
...