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 ServletModule
s 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
@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
ExceptionMapper
s that can be implemented and loaded by adding the@Provider
annotation. One particular type would be aExceptionMapper<NotFoundException>
, which is invoked when a Resource throws aNotFoundException
. TheExceptionMapper
can then decide what response to generate, including the status code.