Spring Boot REST API参数接收异常:单字符串被存储为数组
解决Angular传字符串数组到Spring Boot后端的异常问题
我猜你遇到的情况是:前端传多个文件名数组,后端接收到的却把整个数组字符串当成了单个元素,或者单个文件名被莫名包装成数组?别慌,这个问题我之前也碰过,主要是FormData传递数组的格式和Spring Boot期望的不匹配导致的,咱们来搞定它:
问题根源
Spring Boot的@RequestParam接收数组时,默认期望的是同一个参数名携带多个独立值(比如请求参数里的filenames=file1.jpg&filenames=file2.jpg),但如果你直接把数组塞给FormData,Angular会把数组序列化成一个字符串(比如[file1.jpg,file2.jpg]),后端拿到后就会把这个整个字符串当成数组的唯一元素,自然就出现了你说的异常。
具体解决方案
方案一:正确构建FormData(推荐,适用于需要同时传文件的场景)
不要直接把数组作为值传给FormData,而是循环数组,给同一个filenames参数逐个添加值:
importFiles(filenames: string[]): Observable<Response> { const formData: FormData = new FormData(); // 循环遍历数组,给同一个key添加多个值 filenames.forEach(filename => { formData.append('filenames', filename); }); // 发送POST请求,这里假设你用HttpClient return this.http.post('/import', formData); }
这样后端的@RequestParam("filenames") String[] filenames就能正确解析出每个文件名,不会出现格式异常。
方案二:用@RequestBody接收(适用于仅传数组、无需FormData的场景)
如果你的接口不需要上传文件,只是单纯传递文件名数组,完全可以不用FormData,直接传JSON格式:
Angular端代码:
importFiles(filenames: string[]): Observable<Response> { return this.http.post('/import', filenames, { headers: new HttpHeaders({ 'Content-Type': 'application/json' }) }); }
Spring Boot端修改:
把@RequestParam改成@RequestBody,直接接收JSON数组:
@RequestMapping(value = "/import", method = RequestMethod.POST) @CrossOrigin public void importComicFiles(@RequestBody String[] filenames) { for (String filename : filenames) { // 你的处理逻辑 } }
额外小贴士
如果后端还是有接收问题,可以给@RequestParam加上required属性明确要求,比如:
@RequestParam(value = "filenames", required = true) String[] filenames
不过只要前端按正确格式传,这个一般不需要。
内容的提问来源于stack exchange,提问作者mcpierce
相关产品推荐
相关产品推荐

