You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:42:25