如何为Dropwizard应用定义Jersey上下文根及全局基础URL?
没问题,这其实是Dropwizard里很常见的需求——把公共的基础路径抽出来统一管理,不用每个资源类都重复写冗长的@Path注解。下面分步骤给你讲清楚怎么实现:
1. 配置应用级的基础URL(Jersey上下文根)
Dropwizard提供了两种方式来设置Jersey的上下文根,最推荐的是通过配置文件,因为它能在不同环境(开发/生产)灵活修改:
方式一:通过YAML配置文件
在你的应用配置文件(比如config.yml)里,添加server.rootPath配置项,指定你的基础路径,注意要以/*结尾,这样Jersey才能正确拼接资源的子路径:
server: rootPath: /api/ice-cream-service/*
方式二:通过代码硬编码(不推荐,灵活性差)
如果不想用配置文件,也可以在Application类里直接注册Jersey容器时指定路径:
@Override public void run(IceCreamConfiguration config, Environment env) { // 创建Jersey资源配置 ResourceConfig resourceConfig = new ResourceConfig() .register(SizeResource.class) .register(FlavorResource.class); // 注册Servlet并指定上下文根 ServletContainer jerseyServlet = new ServletContainer(resourceConfig); env.servlets().addServlet("ice-cream-jersey", jerseyServlet) .addMapping("/api/ice-cream-service/*"); }
2. 编写简洁的资源类
现在你可以给资源类只写短路径的@Path注解,不用包含基础部分了:
比如SizeResource.java:
@Path("/sizes") @Produces(MediaType.APPLICATION_JSON) public class SizeResource { @GET public List<String> getAllSizes() { return Arrays.asList("Small", "Medium", "Large", "Extra Large"); } }
FlavorResource.java同理:
@Path("/flavors") @Produces(MediaType.APPLICATION_JSON) public class FlavorResource { @GET public List<String> getAllFlavors() { return Arrays.asList("Vanilla", "Chocolate", "Strawberry", "Mint Chip"); } }
3. 验证效果
启动你的Dropwizard应用后,就可以通过以下URI访问资源了:
GET /api/ice-cream-service/sizesGET /api/ice-cream-service/flavors
完全符合你的需求,而且以后如果要修改基础路径(比如改成/api/v2/ice-cream-service),只需要改配置文件的server.rootPath就行,不用修改任何资源类的代码,维护起来特别方便。
内容的提问来源于stack exchange,提问作者Sam Berry
相关产品推荐
相关产品推荐

