是否可以从另一个调用一个jax-rs方法?

时间:2014-03-09 08:39:02

标签: java jersey 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重定向)和通常我想重定向的资源方法不共享相同的签名(他们可能有路径参数等,如我给出的示例)。

我在apache tomcat下运行jersey 2.6(它是一个spring应用程序,如果有任何帮助的话)

编辑 - 我正在寻找与servlet forward相当的jax-rs。我不想做额外的http跳或担心自己实例化资源类

2 个答案:

答案 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请求。