Java 可以从一个jax-rs方法调用另一个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 ? } } } 我想
@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)。