SpringBoot如何通过Swagger接口向Controller传入JSONArray参数
问题根源
- 你使用
@RequestParam接收JSONArray类型参数时,Spring默认没有内置String到org.json.JSONArray的类型转换器,且Swagger会将@RequestParam修饰的数组类型识别为多值参数,自动拆分你输入的JSON字符串,导致实际传入后端的第一个值是拆分后的name1,自然不符合JSONArray必须以[开头的要求。 @RequestParam参数默认是放在请求URL查询参数或者表单字段中,本身就不适合传输长度较长、结构复杂的JSON数据。- 你原有代码中的
@Postmapping存在拼写错误,正确写法为@PostMapping(首字母M大写)。
解决方案1(推荐):改用@RequestBody接收请求体
这种方式天然支持Swagger显示单文本框输入JSON,不需要额外配置转换器,符合REST接口设计规范。
修改后的Controller代码:
@RestController public class NameRegisterController{ @Autowired private NameRegisterService service; @PostMapping(path="/control") public void NameRegisterAdd(@RequestBody JSONArray NameList) { service.addNames(NameList); } }
可选依赖配置
如果启动后报转换器找不到异常,说明你的项目缺少Jackson对org.json类型的序列化支持,添加对应依赖即可(Maven示例):
<dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-json-org</artifactId> <version>2.15.2</version> </dependency>
修改后Swagger会自动显示单文本的请求体输入框,直接输入["name1","name2","name3"]即可正常接收。
解决方案2:坚持使用@RequestParam的处理方式
如果你确实需要通过请求参数传输JSONArray,先以String类型接收参数,再手动转换为JSONArray:
修改后的Controller代码:
@RestController public class NameRegisterController{ @Autowired private NameRegisterService service; @PostMapping(path="/control") public void NameRegisterAdd(@RequestParam String NameList) { JSONArray jsonArray = new JSONArray(NameList); service.addNames(jsonArray); } }
修改后Swagger会显示单文本输入框,你输入的JSON字符串会完整传入后端,手动转换即可避免拆分报错。
内容的提问来源于stack exchange,提问作者Arnab Ghosh
相关产品推荐
相关产品推荐

