#java #jax-rs #resteasy
#java #jax-rs #resteasy
Вопрос:
В приложении RESTEasy мне нужно определить во время выполнения, может ли определенный путь обрабатываться определенным методом ресурсов, на основе его параметров path / query. Если это не может быть обработано, я хочу, чтобы запрос был перенаправлен на другие методы. Например.:
@Path("/")
class MyResource {
@GET
@Path("{path : .*}")
public Response handleRedirects(@PathParam("path") String path) {
if (hasRedirectFor(path)) {
return redirectTo(path);
}
else {
//somehow pretend that this method didn't exist and fallback to the next best match
}
}
@GET
@Path("img/{image}")
public Response handleImage(@PathParam("image") String someParam) {
return createImageResponse(image);
}
@GET
@Path("{template : .*\.html}")
public Response handleTemplate(@PathParam("template") String template) {
return createTemplateResponse(template);
}
}
Возможно ли это каким-то образом без использования RequestFilter
? (Я не хочу использовать RequestFilter
с тех пор, как мне нужно реализовать сопоставление URL для handleSometimes
себя).
РЕДАКТИРОВАТЬ: В комментариях было запрошено предоставить более подробную информацию, поэтому я изменил пример, чтобы он соответствовал моей реальной ситуации. У меня есть обычный веб-сервер, который обрабатывает всевозможные запросы, в приведенном выше примере я сократил его до просто изображений и шаблонов. По устаревшим причинам есть некоторые входящие ссылки от третьих сторон на URL-адреса, которые не существуют (или больше не существуют), но которые мы не хотим нарушать. Поэтому мы хотим обслуживать перенаправления по этим URL-адресам, что и должна делать handleRedirects
функция.
К сожалению, шаблоны для устаревших и поддерживаемых URL-адресов перекрываются, что мешает мне писать @Path
аннотации для статического перехода к правильному методу. Более того, я знаю, могу ли я на самом деле сгенерировать перенаправление из legacy -> new, только когда я проверяю путь во время выполнения, если это не удается, я хочу вернуться к другим методам. Поэтому я хочу иметь возможность определять в самом методе, могу ли я обработать запрос или нет, и позволить RESTEasy перейти к следующему соответствующему ресурсу, если это невозможно. Обычно это то, что пригодилось бы для фильтров, но тогда я теряю возможность автоматически извлекать параметры пути или перенаправлять к другим методам, которые мне действительно нравится сохранять.
Комментарии:
1. Не совсем понятно, чего вы пытаетесь достичь. Не могли бы вы добавить больше деталей?
2. Я обновил свой пример и добавил больше объяснений, надеюсь, теперь это более понятно.
3. Как я вижу, вы уже отказались от фильтров. Но мне просто интересно, я вы когда-нибудь рассматривали фильтр предварительного сопоставления . Не могло ли это сработать? В фильтре предварительного сопоставления вы даже можете изменить запрошенный URI.
4. Фильтры предварительного сопоставления выполняют свою работу, но это действительно последнее средство. На самом деле у меня есть не только один
handleRedirects
метод, но и множество разных методов, которые выполняют перенаправление определенного типа. Большинству этих методов также необходимо извлечь некоторые параметры запроса / пути из URL. Если я использую фильтр, мне нужно реализовать собственную маршрутизацию и извлечение параметров. Я предпочитаю использовать аннотации JAX-RS, чтобы сделать это за меня.5. Другим возможным решением может быть
ResourceContext
. Посмотрите здесь для получения дополнительной информации.