Можно ли вызвать один метод 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-хоп или беспокоиться о том, как создавать классы ресурсов самостоятельно
Ответы
Ответ 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 запрос.