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

rad*_*dai 14 java jax-rs jersey

假设我有一些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 ?
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

我想有条件地将调用重定向到其他一些jax-rs资源:

public class ResourceB {
   @GET
   @Path("{identifier}")
   public Other get(@PathParam("identifier")String someArg) {
   }
}
Run Code Online (Sandbox Code Playgroud)

我该怎么做呢?请注意,我不希望这对客户端可见(因此没有http重定向)和通常我想重定向的资源方法不共享相同的签名(他们可能有路径参数等,如我给出的示例).

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

编辑 - 我正在寻找一个jax-rs相当于servlet前进.我不想做额外的http跳或担心我自己实例化资源类

Har*_*rry 14

您可以使用ResourceContext获取它,如下所示:

@Context 
ResourceContext resourceContext;
Run Code Online (Sandbox Code Playgroud)

这会将ResourceContext注入您的资源.然后,您可以获得所需的资源:

ResourceB b = resourceContext.getResource(ResourceB.class);
Run Code Online (Sandbox Code Playgroud)

ResourceContextJavadoc就在这里.你可以在这里找到类似的问题


jko*_*acs 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在资源方法与请求匹配并执行且没有http重定向或其他内部http请求之前,这将在内部将每个请求重定向/redirect/some/resource/some/resource(或传递给任何内容requestContext.setRequestUri()).