首页 > 解决方案 > java - 如何从Java Jersey + Dropwizard中的给定路径反向查找资源?

问题描述

如果给定了一个相对路径(例如path = "/foo/1/bar"),我如何找出将使用哪个资源的方法来处理请求(这将是FooResource.bar当前示例中的方法)?

我试图通过查看所有带@Path注释的类和方法来使用反射,并构建一个映射以指向这些方法。但是,这并不理想,因为我必须针对所有现有@Path的 s 测试给定的相对路径。

这是一个示例资源:

@Path("/foo")  
public class FooResource {
    @GET
    @Path("{id}/bar")
    public String bar(@PathParam("id") int barId)
    {
        return "Hello Bar " + Integer(barId).toString();
    }


    @POST
    @Path("/biz")
    public String biz(BisRequest biz)
    {
        return "Hello Biz";
    }
}

而不是我目前的解决方案,即:

mapper = new HashMap<String, Method>();
/** content of mapper
String "/foo/{id}/bar" -> java.lang.reflect.Method FooResource.bar
String "/foo/biz"      -> java.lang.reflect.Method FooResource.biz
*/

public Method findResourceMethodForPath(String path, HashMap<String, Method> mapper) {
     String correctKey = findCorrectKeyForPath(path, mapper.keySet());
     return mapper.get(correctKey);
}

是否有一种更简洁的方法来实现findResourceMethodForPath而不必使用mapper上面代码段中定义的 ?

标签: javarestjerseydropwizard

解决方案


通过使用 Dropwizard 提供的过滤器找到了答案。

public void filter(ContainerRequestContext requestContext) {
    UriRoutingContext routingContext = (UriRoutingContext) requestContext.getUriInfo();
    ResourceMethodInvoker invoker = (ResourceMethodInvoker) routingContext.getInflector();
    Class<?> className = invoker.getResourceClass();
    Method methodName = invoker.getResourceMethod(); 
}

从这篇文章中找到答案:如何在 ContainerRequestFilter 中检索请求的匹配资源


推荐阅读