Jersey resource that matches any path

2019-06-04 20:40发布

问题:

I am using Jersey v1.x and a Guice Servlet. What I'm trying to do is bind a Jersey Resource that matches any @Path, such that I can use Jersey to respond with a 404.

I'm looking to do this, since my servlet consists of different components (e.g. a rest API that lives under /api, and a web UI that lives under /. In Guice terms, that means I have several ServletModules that each set up one part of the servlet:

  • In my ApiServletModule: serve("/api").with(GuiceContainer.class, conf)
  • In my WebUiServletModule: serve("/").with(GuiceContainer.class, conf)

In this setup, I want to define what the 404 response body looks like for each part of the webapp (/api or /) from the codebase of each subproject responsible, without having to reimplement Jersey


So far I have tried to bind a resource that match @Path("/"), @Path("*") and @Path("/*"), but none of these seem to be picked up when I request /some/path/that/doesnt/exist

回答1:

You need to use the regex format of the path expression, i.e.

@Path("{any: .*}")

You could inject List<PathSegment> to look at all the segments if you need them.

public Response getSomething(@PathParam("any") List<PathSegment> segments)


回答2:

@peeskillet's answer is indeed correct, in the sense that it describes how you can create a Jersey resource that matches any path.
However, my goal of creating a resource that delivers 404 responses for whenever any other unmatched path is requested is not quite met by this answer:

At least in combination with Guice, will such a "match all"-resource intercept all requests, regardless of whether any more specific resources are available. Additionally, you cannot modify the HTTP response status code from within a resource.

For this purpose, Jersey has ExceptionMappers that can be implemented and loaded by adding the @Provider annotation. One particular type would be a ExceptionMapper<NotFoundException>, which is invoked when a Resource throws a NotFoundException. The ExceptionMapper can then decide what response to generate, including the status code.