You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 18:43:20