如何配置Dropwizard Jersey实现资源分属不同根路径
在Dropwizard中配置多路径前缀的Jersey API
可行方案:注册多个Jersey Servlet容器
不需要修改现有所有资源的@Path注解,只需通过注册多个独立的Jersey容器,分别对应/api/*和/internal/*路径即可实现需求。
步骤1:拆分资源类
将外部公开资源和内部专用资源分别放在不同的包下(比如com.yourproject.api和com.yourproject.internal),方便后续分批量注册。
步骤2:注册两个独立的Jersey容器
在项目的Application类的run方法中,不要使用默认的environment.jersey().setUrlPattern(),而是手动创建两个ResourceConfig实例,分别绑定不同的资源包,再注册为Servlet:
@Override public void run(YourAppConfiguration config, Environment environment) { // 配置外部API的Jersey容器 ResourceConfig apiResourceConfig = new ResourceConfig() .packages("com.yourproject.api") // 扫描外部资源包 .register(JacksonFeature.class); // 注册公共组件(如JSON序列化) // 配置内部API的Jersey容器 ResourceConfig internalResourceConfig = new ResourceConfig() .packages("com.yourproject.internal") // 扫描内部资源包 .register(JacksonFeature.class) .register(InternalAuthFilter.class); // 内部API专属组件(如权限校验) // 注册外部API到/api/*路径 environment.getServletContext() .addServlet("api-jersey", new JerseyServletContainer(apiResourceConfig)) .addMapping("/api/*"); // 注册内部API到/internal/*路径 environment.getServletContext() .addServlet("internal-jersey", new JerseyServletContainer(internalResourceConfig)) .addMapping("/internal/*"); }
补充:共享公共配置
如果两个API需要共享过滤器、拦截器或其他Jersey特性,可以抽取公共配置方法,避免重复代码:
private void setupCommonJerseyConfig(ResourceConfig config) { config.register(JacksonFeature.class); config.register(CORSFilter.class); // 其他公共组件注册 } // 在创建ResourceConfig时调用 setupCommonJerseyConfig(apiResourceConfig); setupCommonJerseyConfig(internalResourceConfig);
为什么之前的尝试无效
- 多次调用
environment.jersey().setUrlPattern()会覆盖之前的设置,因为默认只能有一个全局Jersey容器路径。 @Path注解是编译时静态解析的,不支持动态注入变量(比如/{internal-path}这种写法无法实现动态前缀)。
内容的提问来源于stack exchange,提问作者Versizzle
相关产品推荐
相关产品推荐

