Подтвердить что ты не робот

Можно ли вызвать один метод jax-rs из другого?

Предположим, что у меня есть класс ресурсов jax-rs:

@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class ResourceA {
   @GET
   public Something get(@Context UriInfo uriInfo) {
      if (...) {
         //how to get to ResourceB ?
      }
   }
}

и я хочу условно перенаправить вызов на другой ресурс jax-rs:

public class ResourceB {
   @GET
   @Path("{identifier}")
   public Other get(@PathParam("identifier")String someArg) {
   }
}

как это сделать? обратите внимание, что я не хочу, чтобы это было видимым для клиента (так что нет перенаправления http) и вообще методы ресурсов, которые я хочу перенаправить, чтобы не использовать одну и ту же подпись (они могут иметь параметры пути и т.д., как в примере, который я дал).

im работает jersey 2.6 под apache tomcat (его приложение spring, если это любая помощь)

EDIT - im ищет эквивалент jax-rs сервлет вперед. я не хочу делать дополнительный HTTP-хоп или беспокоиться о том, как создавать классы ресурсов самостоятельно

4b9b3361

Ответ 1

Вы можете получить его с помощью ResourceContext следующим образом:

@Context 
ResourceContext resourceContext;

Это добавит ResourceContext в ваш ресурс. Затем вы получите нужный вам ресурс:

ResourceB b = resourceContext.getResource(ResourceB.class);

Javadoc для ResourceContext здесь. Вы можете найти аналогичный вопрос здесь

Ответ 2

Я не знаю никакой возможности сделать это из метода ресурса, но если он подходит вашему прецеденту, то вы можете реализовать свою логику перенаправления в предварительно запрошенном фильтре запросов, например:

@Provider
@PreMatching
public class RedirectFilter implements ContainerRequestFilter {

    @Override
    public void filter(ContainerRequestContext requestContext) {
        UriInfo uriInfo = requestContext.getUriInfo();
        String prefix = "/redirect";
        String path = uriInfo.getRequestUri().getPath();
        if (path.startsWith(prefix)) {
            String newPath = path.substring(prefix.length());
            URI newRequestURI = uriInfo.getBaseUriBuilder().path(newPath).build();
            requestContext.setRequestUri(newRequestURI);
        }
    }
}

Это будет перенаправлять каждый запрос на /redirect/some/resource до /some/resource (или все, что вы переходите на requestContext.setRequestUri()) внутри, до того как метод ресурса был сопоставлен с запросом и выполняется и без перенаправления HTTP или дополнительного внутреннего http запрос.