如何在Java Jersey + Dropwizard中从给定路径反向查找资源?

时间:2019-01-10 15:16:36

标签: java rest jersey dropwizard

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

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

以下是示例资源:

@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

1 个答案:

答案 0 :(得分:0)

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

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

此帖子的答案:How to retrieve matched resources of a request in a ContainerRequestFilter