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

嵌入式Jetty的Maven项目JAX-RS API集成Swagger文档配置问询

搞定Jetty+JAX-RS项目的Swagger文档配置

嘿,我来帮你把剩下的Swagger配置补全!既然你已经搭好了SwaggerServlet的架子,咱们一步步来完成整个流程:

1. 补全Maven依赖

首先得确保你的pom.xml里加了Swagger和JAX-RS整合的必要依赖,还有Swagger UI的资源包(用WebJars最方便):

<!-- Swagger JAX-RS 核心整合依赖 -->
<dependency>
    <groupId>io.swagger</groupId>
    <artifactId>swagger-jaxrs</artifactId>
    <version>1.6.12</version> <!-- 选稳定版本,这个和多数JAX-RS实现兼容 -->
</dependency>
<!-- WebJars版Swagger UI,方便静态资源管理 -->
<dependency>
    <groupId>org.webjars</groupId>
    <artifactId>swagger-ui</artifactId>
    <version>4.18.3</version> <!-- 对应版本要和swagger-core匹配 -->
</dependency>

2. 完善SwaggerServlet的BeanConfig配置

这是Swagger扫描API的核心配置,把你的BeanConfig补全,指定扫描包、API元信息和访问路径:

@WebServlet(name = "SwaggerConfig", loadOnStartup = 1) // 加loadOnStartup让服务器启动就初始化
public class SwaggerServlet extends HttpServlet {
    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        System.out.println("init SwaggerServlet");
        
        BeanConfig beanConfig = new BeanConfig();
        // 替换成你实际的API资源类所在包,Swagger会扫描这个包下的JAX-RS注解
        beanConfig.setResourcePackage("com.yourcompany.yourproject.api");
        // 设置API的基本信息,会显示在Swagger UI里
        beanConfig.setTitle("你的项目API文档");
        beanConfig.setDescription("基于嵌入式Jetty+JAX-RS的后端API接口文档");
        beanConfig.setVersion("1.0.0");
        // 这里要和你的JAX-RS应用根路径一致,比如你的API都是/api开头就填这个
        beanConfig.setBasePath("/api");
        // 启用扫描功能
        beanConfig.setScan(true);
        // 让生成的swagger.json格式更易读
        beanConfig.setPrettyPrint(true);
    }
}

3. 注册Swagger的JAX-RS资源

你的JAX-RS应用类(继承Application的那个)需要注册Swagger自带的资源类,这样才能对外提供swagger.json接口:

public class YourJaxRsApplication extends Application {
    @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> classes = new HashSet<>();
        // 先注册你自己的API资源类
        classes.add(UserApi.class);
        classes.add(OrderApi.class);
        // 注册Swagger的核心资源,用来生成swagger.json
        classes.add(ApiListingResource.class);
        classes.add(SwaggerSerializers.class);
        return classes;
    }
}

4. 配置嵌入式Jetty的Swagger UI访问

因为是嵌入式Jetty,得把Swagger UI的静态资源(通过WebJars引入的)部署到服务器里,在你的Jetty启动代码里加这段配置:

// 假设你已经初始化了Jetty Server实例
Server server = new Server(8080);

// 创建上下文
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath("/");
server.setHandler(context);

// 注册你的JAX-RS应用(以Jersey的ServletContainer为例)
ServletHolder jerseyServlet = context.addServlet(ServletContainer.class, "/api/*");
jerseyServlet.setInitParameter("javax.ws.rs.Application", "com.yourcompany.yourproject.YourJaxRsApplication");

// 注册SwaggerConfig Servlet
context.addServlet(SwaggerServlet.class, "/swagger-config");

// 配置WebJars资源访问,让Swagger UI能加载静态文件
ServletHolder webjarsServlet = context.addServlet(DefaultServlet.class, "/webjars/*");
webjarsServlet.setInitParameter("resourceBase", "META-INF/resources/webjars");
webjarsServlet.setInitParameter("dirAllowed", "false");

// 启动服务器
server.start();
server.join();

5. 给API添加Swagger注解(关键!)

光配置还不够,得给你的JAX-RS资源类和方法加Swagger注解,这样生成的文档才会有详细的描述:

@Path("/users")
@Api(tags = "用户管理API") // 给这个资源类打标签,方便UI分类
public class UserApi {

    @GET
    @Path("/{userId}")
    @Produces(MediaType.APPLICATION_JSON)
    @ApiOperation(value = "根据ID获取用户信息", notes = "传入用户ID,返回该用户的完整详情")
    public User getUser(
        @ApiParam(value = "用户唯一ID", required = true) @PathParam("userId") Long userId
    ) {
        // 你的业务逻辑代码
        return new User(userId, "张三", "zhangsan@example.com");
    }
}

6. 测试验证

启动Jetty服务器后,先访问http://localhost:8080/api/swagger.json,如果能正常返回结构化的JSON,说明Swagger已经成功扫描到你的API了。

然后访问Swagger UI地址:http://localhost:8080/webjars/swagger-ui/4.18.3/index.html?url=http://localhost:8080/api/swagger.json,就能看到可视化的API文档,还能直接在线测试接口!

内容的提问来源于stack exchange,提问作者NikHiL Bonte

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:31:27