我的 API 上有以下路线:
@PostMapping(value = "createParnter", consumes = "multipart/form-data")
public ResponseEntity<String> createPartner(
@ModelAttribute PartnerRequest partnerRequest
)
请求的 DTO 如下:
record Contacts(
String name,
String email,
) {}
public record PartnerRequest(
String name,
MultipartFile logo,
String link,
List<Contact> contacts
){}
但是,如果我尝试一起发送联系人列表,则会出现某种转换错误:
"Failed to convert value of type 'java.lang.String' to required type 'java.util.List'; Cannot convert value of type 'java.lang.String' to required type 'com.example.dto.Contacts' for property 'contacts[0]': no matching editors or conversion strategy found"
联系人列表 JSON 示例:
[{"name": "testName", "email": "testEmail}]
我没有找到任何关于在 SO 或 Reddit 等地方发送对象列表(只是文件)的信息。GPT 也无法给出任何有效的答案
在 Spring Boot 中,处理包含对象列表的多部分请求可能有点棘手,因为多部分请求通常用于文件上传,而表单数据通常采用
key=value
格式。当您尝试发送对象列表时,您需要确保请求的结构正确。
以下是处理多部分请求中的对象列表的方法:
MultipartResolver
添加到您的配置中来完成此操作:import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
@Configuration
@EnableWebMvc
public class MultipartConfig implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
// You can add other message converters if necessary
}
@Bean
public CommonsMultipartResolver multipartResolver() {
CommonsMultipartResolver resolver = new CommonsMultipartResolver();
// You can set maximum upload size here if needed
return resolver;
}
}
@RequestParam
获取联系人列表:import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@RestController
@RequestMapping("/api")
public class PartnerController {
@PostMapping(value = "createPartner", consumes = "multipart/form-data")
public ResponseEntity<String> createPartner(
@RequestParam("name") String name,
@RequestParam("logo") MultipartFile logo,
@RequestParam("link") String link,
@RequestParam("contacts") List<Contact> contacts) {
// Your logic here
return ResponseEntity.ok("Partner created successfully");
}
}
contacts
列表,您可以将其作为 JSON 字符串发送到文本字段之一。确保将“值”设置为联系人列表的 JSON 表示形式。以下是如何在 Postman 中构建请求的示例:
按键:
name
Your Partner Name
按键:
logo
File
Choose your logo file
按键:
link
http://yourpartnerlink.com
按键:
contacts
Text
[{"name": "testName", "email": "testEmail"}]
确保 JSON 字符串格式正确,并且没有拼写错误或语法错误。
logging.level.org.springframework.web=DEBUG
这将使您更深入地了解请求负载以及 Spring 如何尝试将其绑定到您的控制器方法。
请记住,在处理多部分请求时,数据是分段发送的,每个部分都有自己的标头和正文。 Spring Boot 使用
MultipartResolver
来解析这些部分并将它们绑定到控制器方法的参数。如果绑定失败,通常意味着请求结构与 Spring 根据控制器方法签名所期望的结构不匹配。