如何通过多部分请求接收 Spring Boot 上的对象列表

问题描述 投票:0回答:1

我的 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
){}

通过邮递员仅发送非列表字段,我收到成功的请求: enter image description here

但是,如果我尝试一起发送联系人列表,则会出现某种转换错误:

"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 也无法给出任何有效的答案

java spring-boot
1个回答
0
投票

在 Spring Boot 中,处理包含对象列表的多部分请求可能有点棘手,因为多部分请求通常用于文件上传,而表单数据通常采用

key=value
格式。当您尝试发送对象列表时,您需要确保请求的结构正确。

以下是处理多部分请求中的对象列表的方法:

  1. 启用多部分配置:确保您在 Spring Boot 应用程序中启用了多部分支持。您可以通过将
    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;
    }
}
  1. 控制器方法:您的控制器方法应该能够处理文件和对象列表。您可以使用
    @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");
    }
}
  1. 发送请求:当使用Postman或任何其他工具发送请求时,您需要按如下方式构造您的请求:
  • 对于文件,请使用“文件”选项卡并上传文件。
  • 对于其他字段,请使用“参数”选项卡并将每个字段添加为键值对。
  • 对于
    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 字符串格式正确,并且没有拼写错误或语法错误。

  1. 调试:如果您仍然遇到问题,可以启用 Spring MVC 的调试日志记录以获取有关请求处理期间发生的情况的更多信息:
logging.level.org.springframework.web=DEBUG

这将使您更深入地了解请求负载以及 Spring 如何尝试将其绑定到您的控制器方法。

请记住,在处理多部分请求时,数据是分段发送的,每个部分都有自己的标头和正文。 Spring Boot 使用

MultipartResolver
来解析这些部分并将它们绑定到控制器方法的参数。如果绑定失败,通常意味着请求结构与 Spring 根据控制器方法签名所期望的结构不匹配。

© www.soinside.com 2019 - 2024. All rights reserved.