假设我有一些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重定向)和通常我想重定向的资源方法不共享相同的签名(他们可能有路径参数等,如我给出的示例)。
我在apache tomcat下运行jersey 2.6(它是一个spring应用程序,如果有任何帮助的话)
编辑 - 我正在寻找与servlet forward相当的jax-rs。我不想做额外的http跳或担心自己实例化资源类
答案 0 :(得分:12)
您可以使用ResourceContext获取它,如下所示:
@Context
ResourceContext resourceContext;
这会将ResourceContext注入您的资源。然后,您将获得所需的资源:
ResourceB b = resourceContext.getResource(ResourceB.class);
Javadoc for ResourceContext is here。你可以找到similar question here
答案 1 :(得分:5)
我不知道有任何可能从资源方法执行此操作,但如果它适合您的用例,您可以做的是在预匹配请求过滤器中实现重定向逻辑,例如:
@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);
}
}
}
在资源方法与请求匹配并执行且没有http的情况下,这将在内部将每个请求重定向到/redirect/some/resource
到/some/resource
(或者传递给requestContext.setRequestUri()
的任何内容)重定向或额外的内部http请求。