Как отменить поиск ресурса по заданному пути в Java Jersey + Dropwizard? - PullRequest
0 голосов
/ 10 января 2019

Если мне дан относительный путь (скажем, path = "/foo/1/bar"), как я могу узнать, какой метод ресурса будет использоваться для обработки запроса (в данном примере это будет FooResource.bar метод)?

Я пытался использовать Reflections, просматривая все аннотированные классы и методы @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 голосов
/ 11 января 2019

Найден ответ с помощью фильтров, предоставленных 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

...