1. 概述

在实际开发中,接口文档的自动化生成已成为标配,而 Swagger(现为 OpenAPI)是其中最主流的工具之一。本文聚焦两个常被混淆的注解:@ApiParam@ApiModelProperty,帮你理清它们的职责边界,避免踩坑。

✅ 正确使用这两个注解,能显著提升 Swagger UI 的可读性和专业度。
❌ 混用或误用则会导致文档信息错乱,给前端或协作方带来困扰。

我们将通过代码示例和 UI 截图,直观展示它们的差异和正确用法。

2. 核心区别

一句话总结:

@ApiParam 用于接口参数,@ApiModelProperty 用于模型字段。

更具体地说:

  • @ApiParam:修饰 Controller 方法中的请求参数,比如 @RequestParam@PathVariable 等。
  • @ApiModelProperty:修饰 POJO 模型类的字段,比如 User 类中的 firstName

⚠️ 注意:两者作用域完全不同,别搞混了。

3. @ApiParam:接口参数的元数据控制

@ApiParam 的作用是为 API 接口的输入参数添加描述性信息。Swagger 默认能识别 @RequestParam 等注解,但字段名、描述、示例值等往往不够清晰,这时就需要 @ApiParam 来增强。

它能控制以下信息:

  • name:参数名(可覆盖)
  • value:参数描述
  • example:示例值
  • required:是否必填
  • type:数据类型(通常可省略,Swagger 会自动推断)

示例代码

@RequestMapping(
    method = RequestMethod.POST,
    value = "/createUser",
    produces = "application/json; charset=UTF-8")
@ResponseStatus(HttpStatus.CREATED)
@ResponseBody
@ApiOperation(value = "创建用户", 
  notes = "该接口用于创建新用户")
public User createUser(
  @ApiParam(
    name = "firstName",
    type = "String",
    value = "用户的姓名",
    example = "Vatsal",
    required = true)
  @RequestParam String firstName) {
 
    User user = new User(firstName);
    return user;
}

Swagger UI 效果

userimage

可以看到,参数的描述、示例值都清晰展示,前端一看就懂。

4. @ApiModelProperty:模型字段的文档定制

当你在接口中返回或接收一个对象时,Swagger 会自动生成该对象的结构定义。但默认字段名可能不够友好,描述缺失。@ApiModelProperty 就是用来解决这个问题的。

它可以控制:

  • value:字段描述
  • name:字段名(可重命名)
  • dataType:指定数据类型
  • example:示例值
  • hidden:是否在文档中隐藏该字段
  • allowableValues:允许的取值范围(如枚举)

示例代码

public class User {
    
    @ApiModelProperty(
      value = "用户的姓名",
      name = "firstName",
      dataType = "String",
      example = "Vatsal")
    private String firstName;

    // getter/setter 省略
}

Swagger UI 效果

usermodel

模型字段的描述和示例值都完整展示,极大提升了文档可读性。

5. 总结

注解 使用位置 作用目标 典型场景
@ApiParam Controller 方法参数 接口参数 @RequestParam, @PathVariable
@ApiModelProperty Model 类字段 模型属性 POJO 中的字段,用于请求体或响应体

✅ 正确姿势:

  • 参数用 @ApiParam,模型用 @ApiModelProperty,泾渭分明。

❌ 常见错误:

  • 在模型字段上误用 @ApiParam,结果文档不生效。
  • 忽略 example 字段,导致前端不知道传什么格式。

所有示例代码均已上传至 GitHub:https://github.com/baeldung/tutorials/tree/master/spring-boot-modules/spring-boot-swagger-2(mock 链接,实际项目中替换为真实地址)


原始标题:Swagger @ApiParam vs @ApiModelProperty | Baeldung