Формат Джерси и Одата. - PullRequest
       14

Формат Джерси и Одата.

3 голосов
/ 21 февраля 2012

У меня сейчас есть RESTful api, использующий Джерси, и я конвертирую его в стандарт OData. Есть несколько вещей, которые я еще не преобразовал, но доберусь до них, и это не важно в данный момент. Одной из важных вещей, которые мне нужно преобразовать, являются ключевые параметры пути. Одата имеет стандарт изготовления ключа, заключенного в круглые скобки. Таким образом, в этом примере myapi.com/product(1) - это вызов OData для получения продукта с идентификатором 1. В настоящее время это возможно в моей системе с этим myapi.com/product/1

.

Когда я добавляю скобку к параметру пути, я получаю ошибку 404. Мой путь на уровне класса - @Path ("/ product"), а путь на уровне метода - @Path ("({id})"), и используется как @Path ("/ {id}"). Я попытался добавить скобки как часть переменной планирования, чтобы удалить их в методе, и я попытался отформатировать идентификатор с помощью некоторого регулярного выражения @Path ("{id: regex stuff}"), и ни один из них не работает.

Если я задаю свой путь к методу метода следующим образом: @Path "/ ({id})"), то есть вызов myapi.com/product/(1), он работает нормально. Скобка не проблема, очевидно. Кажется, что Джерси разделяет URI на куски, используя прямую косую черту для маршрутизации, и смысл в том, что между id и именем корневого ресурса прямой косой черты нет, тогда ничего не найдено. Это имеет смысл.

Есть ли способ изменить метод Jerseys для сопоставления строк URI с некоторым регулярным выражением или чем-то еще? Кто-нибудь использовал Джерси с Одатой? Я бы предпочел не использовать odata4j только для решения этой проблемы, похоже, должен быть способ заставить это работать.

Что я сделал: Основываясь на ответе Павла Бучека, я реализовал ContainrRequestFilter независимо от фильтра, который я использую для безопасности. В моем случае я не посмотрел, существует ли я, я просто попытался сделать замену.

    try
{
    String uriString = request.getRequestUri().toString();
    uriString = uriString.replaceAll("(\(|\)\/?)", "/");
    request.setUris(request.getBaseUri(), new URI(uriString));
} catch (final Exception e)
{
}
return request;

1 Ответ

1 голос
/ 22 февраля 2012

Я думаю, что самым простым способом обработки этого «протокола» было бы введение ContainerRequestFilter, который заменил бы «() $» на «/ $» во входящем URI.Таким образом, вы сможете обслуживать OData и стандартный запрос REST в одном приложении.

См. http://jersey.java.net/nonav/apidocs/1.11/jersey/com/sun/jersey/spi/container/ContainerRequestFilter.html

Простой фильтр, который я использовал для проверки этого случая:

    rc.getProperties().put(ResourceConfig.PROPERTY_CONTAINER_REQUEST_FILTERS, new ContainerRequestFilter() {
        @Override
        public ContainerRequest filter(ContainerRequest request) {
            try {

                if(request.getRequestUri().toString().endsWith("(1)")) {
                    request.setUris(
                            request.getBaseUri(),
                            new URI(request.getRequestUri().toString().replace("(1)", "/1")));
                }

            } catch (Exception e) {
            }

            return request;
        }
    });

и то и другоеcurl "http://localhost:9998/helloworld(1)"
curl" http://localhost:9998/helloworld/1"
ударил тот же метод ресурсов сейчас.(Очевидно, вам нужно улучшить текущий фильтр, чтобы иметь возможность обрабатывать различные значения, но он должен работать для вас).

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