Как сопоставить суффикс пути к параметру запроса, используя Java-Джерси? - PullRequest
0 голосов
/ 24 мая 2011

Справочная информация: некоторое время назад мы создали RESTful API с использованием Jersey, где мы сопоставляем uri /items.json с массивом идентификаторов json, а /items/-199IDID.json - с объектом json одного элемента.Теперь мы хотим создать список с некоторыми метаданными для каждого элемента и использовать селектор, такой как /items.data.json, похожий на слинга apache.

Пока: я только что расширил UriConnegFilter для анализаURI для дополнительных суффиксов, что-то вроде этого:

public class UriSelectorFilter extends UriConnegFilter {
protected List<String> selectors; // this list is populated in the constructor

    public ContainerRequest filter(ContainerRequest request) {
        super.filter(request);
        // search for suffix in last path segment, see http://java.net/projects/jersey/sources/svn/content/trunk/jersey/jersey-server/src/main/java/com/sun/jersey/api/container/filter/UriConnegFilter.java?rev=5034

        final String[] suffixes = segment.getPath().split("\\.");
        for (int i = suffixes.length - 1; i >= 1; i--) {
            final String suffix = suffixes[i];
            if(selectors.contains(suffix)) {
                request.getQueryParameters().putSingle("selector", suffix);

                final int index = path.lastIndexOf('.' + suffix);
                path = new StringBuilder(path).delete(index, index + suffix.length() + 1).toString();
                suffixes[i] = "";
            }
        }

        if (length != path.length()) {
            request.setUris(
                    request.getBaseUri(),
                    request.getRequestUriBuilder().replacePath(path).build());
        }
        return request;
    }
}

Этот фильтр отлично работает, он находит селекторную часть моего URI и добавляет параметр запроса к объекту запроса.Но в своем ресурсе я добавил атрибут @QueryParam, который заполняется только значением по умолчанию, а не добавленным значением запроса:

@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getItemsJSON(@DefaultValue("id") @QueryParam("selector") String selector) {
    // query param is not filled with the selector that was found in the UriSelectorFilter
}

У кого-нибудь есть предложение, как я могу предоставить свой ресурс с помощью селектора, которыйбыл обнаружен?Есть ли лучший способ, чем использовать QueryParam?(Примечание: если я добавлю запрос к своему URL-адресу как «? Selector = что-то», то атрибут будет заполнен правильно.)

Любая помощь очень ценится.

1 Ответ

0 голосов
/ 24 мая 2011

Вам нужен еще один аргумент, помеченный @PathParam, и вы должны указать в своей аннотации @Path (для метода или класса), как связать эти биты вместе.Например, чтобы иметь дело с путем, подобным /items/foobar42/data.json, вы можете сделать следующее:

@GET
@Path("/items/{item}/data.json")
@Produces(MediaType.APPLICATION_JSON)
public Response getItemsJSON(@PathParam("item") String itemId,
        @DefaultValue("id") @QueryParam("selector") String selector) {
    // Now you've got an itemId and a possible selector...
}

Попытка сделать все сопоставления с помощью фильтра ... это кажется мне трудным, учитывая, что есть хороший декларативный способ выполненияэто вместо.Вы можете даже указать регулярное выражение в @Path, чтобы разрешить сопоставление с более сложной переменной;Я делаю это в своем собственном коде, чтобы создать метод, который может обслуживать целую иерархическую файловую систему.

(Обратите внимание, что элемент { в скобках } в @Path должен соответствовать имени в @PathParam аннотации, и вы можете при необходимости сопоставить несколько элементов из пути; просто используйте несколько @PathParam -аннотированных аргументов.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...