本文共 1699 字,大约阅读时间需要 5 分钟。
最近在尝试使用 Swagger 2.x 的时候遇到了一个关于参数注入的问题,导致程序报错,感觉有点难下手。今天想一下怎么解决这个问题,记录下来方便以后查阅。
当在某个 controller 方法头注入 String 参数 "开始时间" 的时候,系统报错提示 Required String parameter "开始时间"
,提示无法找到正确的注入参数。虽然看起来和 Swagger 参数映射相关,但仔细检查发现问题其实在参数名称的命名不统一。
spring-bootVersion=2.1.4Lucene version: 8.11.6δίwa{xIJlqXStY"(把实际应用的版本和依赖库打印出来更清晰/Application.Controllers*Controller.java
)// 其他配置...
####问题原因:Spring Boot 无法识别正确的注入源,原因在于:
@ApiParam 和 @RequestParam 的命名不统一。
@ApiParam默认映射的是يبądutyProfile 参数 namespacing。
@RequestParam直接解析请求参数名。
比如,如果 controller 中使用 @ApiParam(name = "startTime")
和 @RequestParam(value = "开始时间")
,但 Spring 只能识别其一,导致参数无法正确注入。
####解决方法:
参数命名统一:确保controller 方法中的 @ApiParam
和 @RequestParam
的 name 填写一致。
startTime
还是 开始时间
,方法内部参数命名都应选择一个(如 startTime
)。使用默认映射:如果需要灵活映射,可以在 controller 方法中使用 @RequestBody
或 @RequestParam
:
@PostMapping("/api/test")public ResponseEntity test( @ApiParam("startTime") String startTime, @RequestBody MaprequestBody) { // 处理逻辑}
注意 Swagger文档优化:
paths: /api/test: post: description: 测试端点 requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/Request'
####实际修复示例:假设修改后的 controller 方法头为:
@ApiParam(name = "startTime")String startTime,@RequestParam(name = "开始时间")String requestBody,
startTime
和 requestBody
正确传输.参数命名不规范会导致Spring Boot 异常处理机制出现问题,建议开发者在 Swagger 2.x 开发过程中统一参数命名,避免混淆。在遇到实际问题时,及时通过IDE反馈调试,确保 controller 中的 @ApiParam
和 @RequestParam
的名称配合正确。这样不仅节省调试时间,也有助于 API 文档的规范化。
原文:2019-07-15 Mr.chenyb
转载地址:http://jiyaz.baihongyu.com/