匹配任何路径的Jersey资源

时间:2015-06-14 21:23:55

标签: java servlets guice jersey-1.0

我正在使用Jersey v1.xGuice Servlet。 我尝试做的是绑定匹配任何 @Path的泽西资源,以便我可以使用泽西以404响应。

我希望这样做,因为我的servlet包含不同的组件(例如,/api下的其他API,以及/下的Web UI。 在Guice术语中,这意味着我有几个ServletModule,每个都设置了servlet的一部分:

  • 在我的ApiServletModuleserve("/api").with(GuiceContainer.class, conf)
  • 在我的WebUiServletModuleserve("/").with(GuiceContainer.class, conf)

在此设置中,我想从负责的每个子项目的代码库定义webapp的每个部分(/api/)的404响应正文,而无需重新实现Jersey

到目前为止,我已尝试绑定与@Path("/")@Path("*")@Path("/*")匹配的资源,但在我请求/some/path/that/doesnt/exist <时,这些资源似乎都没有被接收/ p>

2 个答案:

答案 0 :(得分:7)

您需要使用路径表达式的正则表达式格式,即

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

如果需要,您可以注入List<PathSegment>查看所有细分。

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

答案 1 :(得分:0)

@peeskilletanswer确实是正确的,因为它描述了如何创建匹配任何路径的Jersey资源。
但是,我的目标是创建一个资源,以便在请求任何其他不匹配的路径时提供404响应,这个答案并不能完全满足:

至少与Guice结合使用,无论是否有更多特定资源,这样的“匹配所有”资源都会拦截所有请求。此外,您无法从资源中修改HTTP响应状态代码。

为此,Jersey可以通过添加ExceptionMapper注释来实现和加载@Provider。一个特定类型是ExceptionMapper<NotFoundException>,当资源抛出NotFoundException时会调用它。然后ExceptionMapper可以决定生成什么样的响应,包括状态代码。