RESTEasy: как вернуться к другим методам сопоставления ресурсов?

#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 . Посмотрите здесь для получения дополнительной информации.