Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 可以从一个jax-rs方法调用另一个jax-rs方法吗?_Java_Jersey_Jax Rs - Fatal编程技术网

Java 可以从一个jax-rs方法调用另一个jax-rs方法吗?

Java 可以从一个jax-rs方法调用另一个jax-rs方法吗?,java,jersey,jax-rs,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资源类:

@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重定向),通常我要重定向到的资源方法不共享相同的签名(它们可能具有路径参数等,如我给出的示例所示)

我在ApacheTomcat下运行jersey 2.6(这是一个spring应用程序,如果有帮助的话)


编辑-我正在寻找与之相当的jax-rs。我不想做额外的http跃点,也不担心自己实例化资源类,我不知道从资源方法中执行此操作的任何可能性,但如果它适合您的用例,您可以做的是在预匹配请求筛选器中实现重定向逻辑,例如:

@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请求。

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

@Context 
ResourceContext resourceContext;
这将把ResourceContext注入到您的资源中。然后,您可以使用以下方式获得所需的资源:

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

这个。您可以找到一个很好的建议,但不幸的是,我的路由逻辑依赖于资源方法内部计算的值(来自参数/请求正文值等),因此我以前无法执行重定向。@radai明白了,太糟糕了。请注意,您可以通过UriInfo访问筛选器中的路径和查询参数,但不能访问表单参数/请求正文(无需使用正文afaik)。使用CXF时,请注意,您需要使用资源URI。ie
setRequestUri(新Uri(“/path/to/other”)
(在
@path(“/path/to/other”)
中找到)不是绝对Uri。例如,此答案中的上述代码不适用于CXF(2.7.18)。