Подтвердить что ты не робот

Как я могу сопоставить разделенные точкой с запятой PathParams в Джерси?

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

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

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

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

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

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

В общем, тип Java метода параметр может (...) 4) быть списком, Set или 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

Обновление: changelog для Jersey 1.3 включает эту информацию:

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

Я проведу StringReaderProvider на основе этого сообщения http://comments.gmane.org/gmane.comp.java.jersey.user/7545

4b9b3361

Ответ 1

Когда вы используете точку с запятой, вы создаете Параметры матрицы. Вы можете использовать либо @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)