Skip to content

配置说明

SpringDoc 提供了丰富的配置选项,本章节将详细介绍如何配置 SpringDoc 以满足各种项目需求。

基本配置

SpringDoc 的配置主要在 application.ymlapplication.properties 文件中进行设置。以下是常用的配置项:

API 文档配置

yaml
springdoc:
  api-docs:
    # 是否开启接口文档
    enabled: true
    # OpenAPI文档的路径
    path: /v3/api-docs

Swagger UI 配置

yaml
springdoc:
  swagger-ui:
    # swagger-ui路径
    path: /swagger-ui.html
    # 持久化认证数据
    persistAuthorization: true
    # 文档展开方式
    docExpansion: none # 可选值: list, full, none
    # 隐藏顶部工具栏和底部信息栏
    displayRequestDuration: true
    # 默认的模型渲染方式
    defaultModelsExpandDepth: -1

文档信息配置

yaml
springdoc:
  info:
    # 标题
    title: '标题:SpringDoc后台管理系统_接口文档'
    # 描述
    description: '描述:用于管理集团旗下公司的人员信息,具体包括XXX,XXX模块...'
    # 版本
    version: '版本号: 1.0.0'
    # 作者信息
    contact:
      name: lcz
      email: 1926585708@qq.com
      url: https://gitee.com/hsqyz

安全配置

yaml
springdoc:
  components:
    # 鉴权方式配置
    security-schemes:
      apiKey:
        type: APIKEY
        in: HEADER
        name: Authorization

分组配置

yaml
springdoc:
  # 分组配置
  group-configs:
    - group: SpringDoc项目模块接口文档
      packages-to-scan: com.hsqyz
    - group: 系统管理接口
      packages-to-scan: com.hsqyz.system

完整配置示例

以下是一个完整的配置示例,包含了 SpringDoc 的大部分常用配置:

yaml
# springdoc-openai 配置
springdoc:
  api-docs:
    # 是否开启接口文档
    enabled: true
    # OpenAPI文档的路径
    path: /v3/api-docs
    # 是否使用版本号
    resolve-schema-properties: true
    # 是否开启请求规则
    default-consumes-media-type: application/json
    # 是否开启响应规则
    default-produces-media-type: application/json
  swagger-ui:
    # swagger-ui路径
    path: /swagger-ui.html
    # 模型默认展开深度
    default-models-expand-depth: 1
    # 支持JSON形式访问
    urls-primary-name: JSON
    # 文档查询参数名称
    query-config-enabled: true
    # 持久化认证数据
    persist-authorization: true
    # 文档操作展开方式
    doc-expansion: none # list, full, none
    # 显示请求的持续时间
    display-request-duration: true
    # 深层链接
    deep-linking: true
    # 操作标签是否排序
    operations-sorter: alpha
    # 标签是否排序
    tags-sorter: alpha
    # 禁用默认的URL
    disable-swagger-default-url: true
  # 是否显示actuator端点
  show-actuator: false
  # 是否默认使用tags排序
  use-management-port: false
  # 不返回空引用
  writer-with-default-pretty-printer: true
  # 信息配置
  info:
    # 标题
    title: 'SpringDoc API文档'
    # 描述
    description: '基于JavaDoc的API文档系统'
    # 版本
    version: '1.0.0'
    # 许可证
    license:
      name: MIT
      url: https://opensource.org/licenses/MIT
    # 联系人
    contact:
      name: lcz
      email: 1926585708@qq.com
      url: https://gitee.com/hsqyz
  # 鉴权配置
  components:
    security-schemes:
      apiKey:
        type: APIKEY
        in: HEADER
        name: Authorization
      basic:
        type: HTTP
        scheme: basic
      bearer:
        type: HTTP
        scheme: bearer
        bearer-format: JWT
  # 默认的全局安全配置
  security:
    - apiKey: []
  # 分组配置
  group-configs:
    - group: '用户模块API'
      packages-to-scan: com.example.user
    - group: '订单模块API'
      packages-to-scan: com.example.order
    - group: '系统管理API'
      packages-to-scan: com.example.system

JavaDoc 标签支持

SpringDoc 支持以下 JavaDoc 标签,您可以在代码注释中使用这些标签来丰富文档内容:

标签描述示例
@param描述方法参数@param id 用户ID
@return描述返回值@return 用户对象
@throws描述可能抛出的异常@throws NotFoundException 当用户不存在时
@deprecated标记为已弃用@deprecated 请使用新的API
@see引用其他类或方法@see UserService#getUser
@since指定引入版本@since 1.0.0
@version版本信息@version 1.0.0

JavaDoc 示例

以下是一个完整的控制器示例,展示了如何使用 JavaDoc 注释来生成丰富的 API 文档:

java
/**
 * 订单管理控制器
 * <p>
 * 提供订单的创建、查询、修改和删除等功能。
 * 支持按条件查询订单和导出订单数据。
 * </p>
 * 
 * @author lcz
 * @version 1.0.0
 * @since 1.0.0
 */
@RestController
@RequestMapping("/api/orders")
public class OrderController {

    private final OrderService orderService;

    /**
     * 构造函数注入OrderService
     * 
     * @param orderService 订单服务
     */
    public OrderController(OrderService orderService) {
        this.orderService = orderService;
    }

    /**
     * 分页查询订单列表
     * <p>
     * 支持按订单状态、创建时间等条件筛选订单数据。
     * 结果按创建时间降序排列。
     * </p>
     * 
     * @param status 订单状态,可选值:PENDING, PAID, SHIPPED, COMPLETED, CANCELLED
     * @param startDate 订单创建开始日期,格式:yyyy-MM-dd
     * @param endDate 订单创建结束日期,格式:yyyy-MM-dd
     * @param page 页码,从0开始
     * @param size 每页大小,默认10
     * @return 订单分页数据
     * @throws IllegalArgumentException 当日期格式不正确时
     * @see OrderStatus
     */
    @GetMapping
    public Page<Order> getOrders(
            @RequestParam(required = false) OrderStatus status,
            @RequestParam(required = false) 
            @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate startDate,
            @RequestParam(required = false) 
            @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate endDate,
            @RequestParam(defaultValue = "0") int page,
            @RequestParam(defaultValue = "10") int size) {
        
        return orderService.findOrders(status, startDate, endDate, page, size);
    }

    /**
     * 创建新订单
     * <p>
     * 创建一个新的订单,并返回创建成功的订单信息,包含订单ID。
     * </p>
     * 
     * @param orderRequest 订单请求对象,包含商品信息、收货地址等
     * @return 创建成功的订单
     * @throws InvalidOrderException 当订单数据无效时
     * @throws ProductNotFoundException 当商品不存在时
     * @throws StockInsufficientException 当商品库存不足时
     */
    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)
    public Order createOrder(@RequestBody @Valid OrderRequest orderRequest) {
        return orderService.createOrder(orderRequest);
    }

    /**
     * 获取订单详情
     * <p>
     * 根据订单ID获取订单的详细信息,包括订单项、收货地址、支付信息等。
     * </p>
     * 
     * @param id 订单ID
     * @return 订单详情
     * @throws OrderNotFoundException 当订单不存在时
     */
    @GetMapping("/{id}")
    public OrderDetail getOrderDetail(@PathVariable Long id) {
        return orderService.getOrderDetail(id);
    }

    /**
     * 取消订单
     * <p>
     * 取消指定的订单,仅支持取消未支付的订单。
     * </p>
     * 
     * @param id 订单ID
     * @param reason 取消原因
     * @throws OrderNotFoundException 当订单不存在时
     * @throws OrderStatusException 当订单状态不允许取消时
     * @deprecated 使用 {@link #updateOrderStatus} 方法替代,设置状态为CANCELLED
     */
    @DeleteMapping("/{id}")
    @ResponseStatus(HttpStatus.NO_CONTENT)
    public void cancelOrder(
            @PathVariable Long id,
            @RequestParam String reason) {
        
        orderService.cancelOrder(id, reason);
    }

    /**
     * 更新订单状态
     * <p>
     * 更新指定订单的状态,状态变更需要遵循订单状态流转规则。
     * </p>
     * 
     * @param id 订单ID
     * @param status 新的订单状态
     * @return 更新后的订单信息
     * @throws OrderNotFoundException 当订单不存在时
     * @throws OrderStatusException 当状态变更不符合规则时
     * @see OrderStatus
     * @since 1.2.0
     */
    @PatchMapping("/{id}/status")
    public Order updateOrderStatus(
            @PathVariable Long id,
            @RequestParam OrderStatus status) {
        
        return orderService.updateOrderStatus(id, status);
    }
}

最佳实践

  1. 确保 JavaDoc 覆盖:对所有控制器、方法、模型类添加完整的 JavaDoc 注释
  2. 使用专业术语:在 JavaDoc 中使用专业和一致的术语,提高文档质量
  3. 详细描述参数:详细说明每个参数的用途、格式和约束
  4. 说明异常情况:使用 @throws 标签说明可能的异常情况
  5. 添加示例值:在配置中为复杂参数提供示例值
  6. 合理分组:使用分组功能将 API 按模块或功能划分,提高文档可读性
  7. 定期更新:随着接口变更及时更新 JavaDoc 注释

进阶配置

自定义 OpenAPI 配置

如果您需要更精细地控制 OpenAPI 配置,可以创建一个配置类:

java
/**
 * SpringDoc OpenAPI 配置类
 */
@Configuration
public class SpringDocConfig {

    /**
     * 自定义 OpenAPI 配置
     */
    @Bean
    public OpenAPICustomizer openAPICustomiser() {
        return openApi -> openApi.addSecurityItem(new SecurityRequirement().addList("bearer-jwt"));
    }

    /**
     * 自定义 API 分组
     */
    @Bean
    public GroupedOpenApi userApi() {
        return GroupedOpenApi.builder()
                .group("用户API")
                .pathsToMatch("/api/users/**")
                .build();
    }

    /**
     * 自定义 API 分组
     */
    @Bean
    public GroupedOpenApi orderApi() {
        return GroupedOpenApi.builder()
                .group("订单API")
                .pathsToMatch("/api/orders/**")
                .build();
    }
}

自定义全局响应

您可以在 JavaDoc 注释中添加响应说明:

java
/**
 * 创建用户
 * 
 * @param user 用户信息
 * @return 创建的用户信息
 * @response 201 创建成功,返回用户信息
 * @response 400 请求参数错误
 * @response 409 用户名已存在
 */
@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public User createUser(@RequestBody @Valid User user) {
    return userService.createUser(user);
}

基于 MIT 许可发布