Как диспетчеризация контролируется в JAX-RS?
Я пишу RESTful веб-сервис с RESTeasy. Это реализация JAX-RS. Вы аннотируете класс или метод одной аннотацией @Path. Регулярные выражения используются для получения параметров пути. Например
@Path("/foo{varname:.*}/bar")
соответствует всем шаблонам, начинающимся с "/foo", заканчивающимся на "/bar" и имеющим что-либо между ними. Все, что находится между ними, присваивается параметру с именем varname.
Некоторые фреймворки (например, Django) имеют список регулярных выражений и методов, которые будут опробованы по порядку. Например, /john/ q / smith, /john/ndom.*‹/smith, /john/ оформления. "/ john / henry / smith" соответствует второму и третьему, но второе будет отправлено, потому что это первое найденное совпадение.
Это возможно в JAX-RS, или нет никакого внутреннего порядка для классов и методов? Для /john/ndom.*‹/ndom.*} вам нужно написать регулярное выражение, которое означает / john / every thing / every thingbutsmith? Вам придется менять его каждый раз, когда вы меняете другие.
1 ответ
Существует четко определенный алгоритм, его описывает раздел 3.7.1 спецификации JAX-RS. Честно говоря, я нахожу объяснение довольно непрозрачным - поэтому, читая его, я не могу ответить на ваш вопрос.
Однако я только что нашел обзор CXF алгоритма выбора, и это, кажется, указывает на то, что правила приоритета действительно позволяют вам делать то, что вы хотите.
Правила приоритета
В JAX-RS
Спецификация определила строгие правила сортировки и приоритета для сопоставления выражений URI и основана на наиболее конкретном алгоритме сопоставления. ВJAX-RS
провайдер собирает набор развернутых выражений URI и сортирует их на основе следующей логики:
Первичный ключ сортировки - это количество буквальных символов в полном шаблоне соответствия URI. Сортировка в порядке убывания. В нашем неоднозначном примере шаблон getCustomer() содержит 11 буквальных символов: /customers/. В шаблоне метода getAd dress() есть 18 буквальных символов: /customers/ plus address. Следовательно, провайдер JAX-RS будет пытаться сопоставить шаблон getAddress() перед getCustomer().
Вторичный ключ сортировки - это количество выражений шаблона, встроенных в шаблон, то есть {id} или {id: .+}. Сортировка в порядке убывания. 3. Третичный ключ сортировки - это количество выражений шаблона не по умолчанию. Выражение шаблона по умолчанию - это выражение, которое не определяет регулярное выражение, то есть {id}.