如何调整Angular请求让Spring Boot直接接收User对象而非字符串
解决方案:让Spring直接接收User类型参数的Angular请求调整
嘿,这个问题我之前也碰到过!核心原因是你现在把User对象转成字符串直接append到FormData里,Spring没法自动把这个字符串解析成User对象——它默认只会把这个当成普通的文本参数。咱们只需要调整Angular里添加User对象到FormData的方式,让Spring能识别出这是一个JSON格式的请求部分就行。
关键修改点
你需要把User对象序列化为JSON字符串后,包装成一个指定了Content-Type为application/json的Blob,再添加到FormData里。这样Spring的消息转换器就能自动把这个Blob解析成User对象了。
修改后的Angular Service代码
createPerson(personClass : User, files : File[]): Observable<HttpEvent<{}>>{ let formdata: FormData = new FormData(); // 构造要发送的User对象(和你原来的逻辑一致) const obj = JSON.parse(JSON.stringify(personClass.city)); const myObj = { avatar: personClass.avatar, username: personClass.username, gender: personClass.gender, country: personClass.country, city: obj.code, about: personClass.about }; // 处理多张图片(和你原来的逻辑一致) const fileCount = files.length; if (fileCount > 0) { for (let i = 0; i < fileCount; i++) { formdata.append('file', files[i]); } } // 重点:把User对象转成JSON Blob后添加到FormData const userJsonBlob = new Blob([JSON.stringify(myObj)], { type: 'application/json' }); formdata.append('user', userJsonBlob); return this.http.post(`${this.webServiceEndpoint}/person`, formdata) .map(res => res.json()) .catch(this.handleError); }
为什么这样改能生效?
- 原来的写法
formdata.append('user', JSON.stringify(myObj))会把JSON字符串作为普通的text/plain类型的表单参数发送,Spring没法自动把它映射到User对象。 - 改成Blob并指定
application/json类型后,Spring的MultipartResolver会识别这个请求部分是JSON格式,然后调用MappingJackson2HttpMessageConverter把它解析成User对象,这样就能直接绑定到@RequestParam("user") User personDTO参数上了。
Spring端无需修改
你的Spring Rest Controller代码保持原样即可:
@PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public ResponseEntity<PersonDTO> createPerson( @RequestParam("user") User personDTO, @RequestParam("file") MultipartFile[] file ) { // 你的业务逻辑 return new ResponseEntity<>(null, responseHeaders, HttpStatus.OK); }
这样调整后,你就能用单个请求同时发送User对象和多张图片,Spring也能直接接收User类型的参数啦!
内容的提问来源于stack exchange,提问作者Tharaka
相关产品推荐
相关产品推荐

