Ответ 1
Вы не можете иметь mutliple @Path
аннотации для одного метода. Это приводит к синтаксической ошибке "дублирования аннотации".
Однако существует несколько способов эффективного сопоставления двух путей к методу.
Регулярные выражения в аннотации @Path
Аннотация @Path
в JAX-RS принимает параметры, значения которых могут быть ограничены с помощью регулярных выражений.
Эта аннотация:
@Path("a/{parameter: path1|path2}")
позволит использовать метод для запросов как для /a/path1
, так и для /a/path2
. Если вам нужно работать с субпатами, выполните слэши: {a:path1\\/subPath1|path2\\/subPath2}
Выполнение ответов с кодом статуса перенаправления
В качестве альтернативы вы можете настроить перенаправление. Здесь можно сделать это в Джерси (эталонная реализация JAX-RS), определив еще один субресурс. Это просто пример, если вы предпочитаете другой способ обработки перенаправления, не стесняйтесь использовать его.
@Path("basepath")
public class YourBaseResource {
//this gets injected after the class is instantiated by Jersey
@Context
UriInfo uriInfo;
@Path("a/b")
@GET
public Responce method1(){
return Response.ok("blah blah").build();
}
@Path("a/b/c")
@GET
public Response method2(){
UriBuilder addressBuilder = uriInfo.getBaseUriBuilder();
addressBuilder.path("a/b");
return Response.seeOther(addressBuilder.build()).build();
}
}
Использование фильтра сервлета для перезаписи URL
Если вам понадобится такая функциональность часто, я предлагаю перехватить входящие запросы с помощью фильтра сервлета и переписать пути "на лету". Это должно помочь вам сохранить все перенаправления в одном месте. В идеале вы можете использовать готовую библиотеку. UrlRewriteFilter
может сделать трюк, если у вас все в порядке с лицензией BSD (подробности см. на сайте своего сайта Google).
Другой вариант - обработать это с помощью прокси, настроенного перед вашим Java-приложением. Вы можете настроить сервер Apache, чтобы предлагать основные правила кэширования и перезаписи без сложностей с вашим кодом Java.