我正在使用Jersey v1.x和Guice Servlet。
我尝试做的是绑定匹配任何 @Path
的泽西资源,以便我可以使用泽西以404响应。
我希望这样做,因为我的servlet包含不同的组件(例如,/api
下的其他API,以及/
下的Web UI。
在Guice术语中,这意味着我有几个ServletModule
,每个都设置了servlet的一部分:
ApiServletModule
:serve("/api").with(GuiceContainer.class, conf)
WebUiServletModule
:serve("/").with(GuiceContainer.class, conf)
在此设置中,我想从负责的每个子项目的代码库定义webapp的每个部分(/api
或/
)的404响应正文,而无需重新实现Jersey
到目前为止,我已尝试绑定与@Path("/")
,@Path("*")
和@Path("/*")
匹配的资源,但在我请求/some/path/that/doesnt/exist
<时,这些资源似乎都没有被接收/ p>
答案 0 :(得分:7)
您需要使用路径表达式的正则表达式格式,即
@Path("{any: .*}")
如果需要,您可以注入List<PathSegment>
查看所有细分。
public Response getSomething(@PathParam("any") List<PathSegment> segments)
答案 1 :(得分:0)
@peeskillet的answer确实是正确的,因为它描述了如何创建匹配任何路径的Jersey资源。
但是,我的目标是创建一个资源,以便在请求任何其他不匹配的路径时提供404响应,这个答案并不能完全满足:
至少与Guice结合使用,无论是否有更多特定资源,这样的“匹配所有”资源都会拦截所有请求。此外,您无法从资源中修改HTTP响应状态代码。
为此,Jersey可以通过添加ExceptionMapper
注释来实现和加载@Provider
。一个特定类型是ExceptionMapper<NotFoundException>
,当资源抛出NotFoundException
时会调用它。然后ExceptionMapper
可以决定生成什么样的响应,包括状态代码。