У меня сейчас есть 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;