JAX-RS/Quarkus子资源反向路由:如何获取URI模板?
解决JAX-RS/Quarkus嵌套子资源的URI模式获取问题
你的代码失效的核心原因是:嵌套子资源类(比如UserResource)本身没有@Path注解,调用UriBuilder.fromResource()时会因为目标类缺少路径注解抛出异常。而JAX-RS的UriInfo接口已经提供了更可靠的方式来获取完整的URI模板,无需手动拼接资源层级。
最终解决方案
直接通过UriInfo获取预拼接好的完整URI模式:
class MyFilter implements ContainerRequestFilter { @Context UriInfo uriInfo; private String getUriTemplate() { List<String> matchedTemplates = uriInfo.getMatchedURIs(false); return matchedTemplates.isEmpty() ? "/" : matchedTemplates.get(matchedTemplates.size() - 1); } @Override public void filter(ContainerRequestContext requestContext) throws IOException { // 获取完整的URI模式,比如"/api/users/{id}" String uriPattern = getUriTemplate(); // 在这里使用uriPattern收集指标 // ... } }
关键说明
UriInfo.getMatchedURIs(false)会返回所有匹配的资源层级的路径模板列表,顺序从根资源到当前子资源。- 参数
false表示保留原始的模板占位符(如{id}),而非替换为请求中的实际参数值(如1711)。 - 列表的最后一个元素就是完整的端点URI模式,无论是简单资源还是嵌套子资源场景都能正确返回。
为什么原代码无法处理嵌套资源
当请求嵌套子资源时,resourceInfo.getResourceClass()返回的是子资源类(如UserResource),该类没有@Path注解,导致UriBuilder.fromResource()初始化失败。而UriInfo内部已经维护了完整的资源匹配链,自动拼接了所有层级的路径模板,无需手动处理资源类和方法的注解。
内容的提问来源于stack exchange,提问作者Werner de Groot
相关产品推荐
相关产品推荐

