Swagger2高频注解解析

本文详细解析了Swagger2中常用注解的功能与用法,包括@Api、@ApiOperation、@ApiImplicitParams、@ApiImplicitParam、@ApiParam、@ApiModel、@ApiModelProperty、@ApiResponses、@ApiResponse等,为开发者提供清晰的API文档编写指南。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Swagger2高频注解解析

这里只讲述@Api、@ApiOperation、@ApiImplicitParams、@ApiImplicitParam、@ApiParam、@ApiModel、@ApiModelProperty、ApiResponses、@ApiResponse这几个常用的。

@Api:用在请求的类上,表示对类的说明
常用参数:
tags=“说明该类的作用,非空时将覆盖value的值”
value=“描述类的作用”
其他参数:
description 对api资源的描述,在1.5版本后不再支持
basePath 基本路径可以不配置,在1.5版本后不再支持
position 如果配置多个Api 想改变显示的顺序位置,在1.5版本后不再支持
produces 设置MIME类型列表(output),例:“application/json, application/xml”,默认为空
consumes 设置MIME类型列表(input),例:“application/json, application/xml”,默认为空
protocols 设置特定协议,例:http, https, ws, wss。
authorizations 获取授权列表(安全声明),如果未设置,则返回一个空的授权值。
hidden 默认为false, 配置为true 将在文档中隐藏

示例:
@Api(tags=“登录请求”)
@Controller
@RequestMapping(value="/highPregnant")
public class LoginController {}

@ApiOperation:用在请求的方法上,说明方法的用途、作用
常用参数:
value=“说明方法的用途、作用”
notes=“方法的备注说明”
其他参数:
tags 操作标签,非空时将覆盖value的值
response 响应类型(即返回对象)
responseContainer 声明包装的响应容器(返回对象类型)。有效值为 “List”, “Set” or “Map”。
responseReference 指定对响应类型的引用。将覆盖任何指定的response()类
httpMethod 指定HTTP方法,“GET”, “HEAD”, “POST”, “PUT”, “DELETE”, “OPTIONS” and “PATCH”
position 如果配置多个Api 想改变显示的顺序位置,在1.5版本后不再支持
nickname 第三方工具唯一标识,默认为空
produces 设置MIME类型列表(output),例:“application/json, application/xml”,默认为空
consumes 设置MIME类型列表(input),例:“application/json, application/xml”,默认为空
protocols 设置特定协议,例:http, https, ws, wss。
authorizations 获取授权列表(安全声明),如果未设置,则返回一个空的授权值。
hidden 默认为false, 配置为true 将在文档中隐藏
responseHeaders 响应头列表
code 响应的HTTP状态代码。默认 200
extensions 扩展属性列表数组

示例:
@ResponseBody
@PostMapping(value="/login")
@ApiOperation(value = “登录检测”, notes=“根据用户名、密码判断该用户是否存在”)
public UserModel login(@RequestParam(value = “name”, required = false) String account,
@RequestParam(value = “pass”, required = false) String password){}

@ApiImplicitParams:用在请求的方法上,表示一组参数说明, @ApiImplicitParam:用在@ApiImplicitParams注解中,指定一个请求参数的各个方面

name:参数名,参数名称可以覆盖方法参数名称,路径参数必须与方法参数一致
value:参数的汉字说明、解释
required:参数是否必须传,默认为false [路径参数必填]
paramType:参数放在哪个地方
· header --> 请求参数的获取:@RequestHeader
· query --> 请求参数的获取:@RequestParam
· path(用于restful接口)–> 请求参数的获取:@PathVariable
· body(不常用)
· form(不常用)
dataType:参数类型,默认String,其它值dataType=“Integer”
defaultValue:参数的默认值

示例:
@ResponseBody
@PostMapping(value="/login")
@ApiOperation(value = “登录检测”, notes=“根据用户名、密码判断该用户是否存在”)
@ApiImplicitParams({
@ApiImplicitParam(name = “name”, value = “用户名”, required = false, paramType = “query”, dataType = “String”),
@ApiImplicitParam(name = “pass”, value = “密码”, required = false, paramType = “query”, dataType = “String”)
})
public UserModel login(@RequestParam(value = “name”, required = false) String account,
@RequestParam(value = “pass”, required = false) String password){}

其他参数(@ApiImplicitParam):
allowableValues 限制参数的可接受值。1.以逗号分隔的列表 2、范围值 3、设置最小值/最大值
access 允许从API文档中过滤参数。
allowMultiple 指定参数是否可以通过具有多个事件接受多个值,默认为false
example 单个示例
examples 参数示例。仅适用于BodyParameters

@ApiModel:用于响应类上,表示一个返回响应数据的信息(这种一般用在post创建的时候,使用@RequestBody这样的场景,请求参数无法使用@ApiImplicitParam注解进行描述的时候)
@ApiModelProperty:用在属性上,描述响应类的属性

示例:
@ApiModel(value=“用户登录信息”, description=“用于判断用户是否存在”)
public class UserModel implements Serializable{

       private static final long serialVersionUID = 1L;

       /**
        * 用户名
        */
       @ApiModelProperty(value="用户名")
       private String account;

       /**
         * 密码
         */
        @ApiModelProperty(value="密码")
       private String password;


    }

其他(@ApiModelProperty):
value 此属性的简要说明。
name 允许覆盖属性名称
allowableValues 限制参数的可接受值。1.以逗号分隔的列表 2、范围值 3、设置最小值/最大值
access 允许从API文档中过滤属性。
notes 目前尚未使用。
dataType 参数的数据类型。可以是类名或者参数名,会覆盖类的属性名称。
required 参数是否必传,默认为false
position 允许在类中对属性进行排序。默认为0
hidden 允许在Swagger模型定义中隐藏该属性。
example 属性的示例。
readOnly 将属性设定为只读。
reference 指定对相应类型定义的引用,覆盖指定的任何参数值

@ApiResponses:用在请求的方法上,表示一组响应
@ApiResponse:用在@ApiResponses中,一般用于表达一个错误的响应信息

    code:数字,例如400
    message:信息,例如"请求参数没填好"
    response:抛出异常的类

示例:
@ResponseBody
@PostMapping(value="/update/{id}")
@ApiOperation(value = “修改用户信息”,notes = “打开页面并修改指定用户信息”)
@ApiResponses({
@ApiResponse(code=400,message=“请求参数没填好”),
@ApiResponse(code=404,message=“请求路径没有或页面跳转路径不对”)
})
public JsonResult update(@PathVariable String id, UserModel model){}

@ApiParam: 用在请求方法中,描述参数信息
name:参数名称,参数名称可以覆盖方法参数名称,路径参数必须与方法参数一致
value:参数的简要说明。
defaultValue:参数默认值
required 属性是否必填,默认为false [路径参数必须填]

示例:
@ResponseBody
@PostMapping(value="/login")
@ApiOperation(value = “登录检测”, notes=“根据用户名、密码判断该用户是否存在”)
public UserModel login(@ApiParam(name = “name”, value = “用户名”, required = false) @RequestParam(value = “name”, required = false) String account,
@ApiParam(name = “pass”, value = “密码”, required = false) @RequestParam(value = “pass”, required = false) String password){}

     或以实体类为参数:
     @ResponseBody
     @PostMapping(value="/login")
     @ApiOperation(value = "登录检测", notes="根据用户名、密码判断该用户是否存在")
     public UserModel login(@ApiParam(name = "model", value = "用户信息Model") UserModel model){}

其他:
    allowableValues    限制参数的可接受值。1.以逗号分隔的列表   2、范围值  3、设置最小值/最大值
    access             允许从API文档中过滤参数。
    allowMultiple      指定参数是否可以通过具有多个事件接受多个值,默认为false
    hidden             隐藏参数列表中的参数。
    example            单个示例
    examples         参数示例。仅适用于BodyParameters
<think>好的,我现在需要帮助用户解决SpringBoot Controller接收前端JSON数据时部分字段为null的问题。用户提到使用的是GetMapping和Post请求,@RequestBody注解,以及BookSearchBo类中的字段缺失。首先,我要根据用户提供的引用资料和常见问题来分析可能的原因。 首先,用户提到使用GetMapping来接收Post请求的数据,这明显有问题。根据引用[3],@RequestBody不支持GET请求,因为GET请求没有请求体。用户可能错误地在Controller方法中使用了GetMapping,而实际上应该使用PostMapping。这是第一个需要检查的点。 接下来,检查@RequestBody注解的使用是否正确。引用[1]和[3]都提到,@RequestBody用于将请求体中的数据绑定到Java对象,且需要正确的Content-Type头,比如application/json。如果前端没有正确设置Content-Type,或者后端没有配置消息转换器,可能导致解析失败,字段为null。 然后,考虑字段名称匹配的问题。引用[4]中提到,后端VO类的字段必须与前端的JSON字段名称完全一致,包括大小写。如果存在不一致,可以使用@JsonProperty注解来指定映射。例如,如果前端发送的是userphone,而后端字段是userPhone,可能需要添加@JsonProperty("userphone")。 另外,检查BookSearchBo类是否有正确的getter和setter方法。如果使用Lombok,需要确认@Data或@Getter/@Setter注解是否正确应用,否则可能导致反序列化失败。 还有,用户可能同时使用了@RequestBody和@RequestParam,根据引用[3],这可能会导致问题,因为@RequestBody会消耗输入流,使得后面的参数无法获取。需要确认方法参数中是否混用了这两个注解,导致部分字段未被解析。 此外,检查是否有嵌套对象或复杂的结构,JSON结构是否与Java对象匹配。例如,如果JSON中有嵌套对象,而Java类中没有对应的嵌套类结构,也会导致字段丢失。 最后,建议用户检查日志中的异常信息,比如Spring是否抛出HttpMessageNotReadableException,这可以帮助定位具体的解析错误。同时,使用Postman或Swagger测试接口,确保请求体格式正确,排除前端发送数据的问题。 总结可能的原因: 1. 错误使用GetMapping处理Post请求 2. 字段名称不匹配 3. 缺少setter方法或Lombok配置问题 4. Content-Type未正确设置 5. 同时使用@RequestBody和@RequestParam导致冲突 6. JSON结构不匹配Java对象 接下来需要逐步引导用户检查这些方面,并提供相应的解决方案。</think>### SpringBoot Controller接收JSON数据部分字段为null问题分析 #### 一、核心原因排查步骤 1. **检查请求方法类型** - 使用`@GetMapping`接收POST请求会导致请求体被忽略[^3] - ✅ 正确做法:将`@GetMapping`改为`@PostMapping` 2. **验证字段名称匹配** - 后端字段名必须与JSON key**完全一致**(包括大小写) - 例如前端发送`{"bookName":"xx"}`,后端字段应为`private String bookName` - ✅ 解决方案:使用`@JsonProperty("jsonKey")`指定映射关系[^4] 3. **检查Setter方法/Lombok配置** - 若使用Lombok需确认类上有`@Data`或`@Getter @Setter`注解 - 手动生成setter方法时需注意命名规范(如`setBookName()`) 4. **确认Content-Type设置** - 请求头必须包含`Content-Type: application/json` - 可通过浏览器开发者工具或Postman验证 ```java // 正确Controller示例 @PostMapping("/search") public Result searchBooks(@RequestBody BookSearchBo params) { // 处理逻辑 } ``` #### 二、特殊场景排查 1. **嵌套对象解析问题** - 若JSON含嵌套结构,需在Java类中定义对应嵌套类 ```java // 前端JSON: {"filter":{"minPrice":100}} public class BookSearchBo { private Filter filter; // 需定义Filter内部类 @Data public static class Filter { private Integer minPrice; } } ``` 2. **日期/数字格式异常** - 使用`@JsonFormat`处理日期格式 ```java @JsonFormat(pattern = "yyyy-MM-dd") private Date publishDate; ``` 3. **字段类型不匹配** - 例如JSON传字符串`"123"`,后端用Integer接收会报错 #### 三、诊断工具推荐 1. **日志检查** 在`application.properties`中添加: ```properties logging.level.org.springframework.web=DEBUG ``` 观察是否出现`HttpMessageNotReadableException` 2. **断点调试** 在Controller方法入口打断点,查看入参对象结构 3. **Swagger/Postman测试** 直接发送原始JSON验证是否正常: ```json { "bookName": "test", "author": "张三" } ``` #### 四、高频问题对照表 | 现象 | 可能原因 | 解决方案 | |------|----------|----------| | 所有字段为null | ① 未使用@RequestBody<br>② 错误请求方法 | 检查注解和请求类型 | | 部分字段为null | ① 命名不一致<br>② 缺少setter方法 | 使用@JsonProperty<br>检查Lombok配置 | | 报400错误 | ① 类型不匹配<br>② JSON格式错误 | 验证JSON合法性 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值