SpringBoot处理form-data表单接收对象数组的方法

 更新时间:2023年11月10日 09:47:54   作者:i查拉图斯特拉如是  
form-data则是一种更加灵活的编码方式,它可以处理二进制数据(如图片、文件等)以及文本数据,这篇文章主要介绍了SpringBoot处理form-data表单接收对象数组,需要的朋友可以参考下

前言

主要是为了存档,碰到表单传对象数组的情况,一般都是一个表单只能传一个对象,后面经过跟前端的研究和讨论发现居然可以传对象数组,以此作为记录分享。

@Data
public class SealLocationInfoRequest  implements Serializable {
    private static final long serialVersionUID = 2392716281569231777L;
    private Long contractId;
    private Long serverId;
    private String filePath;
    private List<SealLocationInfo> sealLocationInfoList;
}
@Data
public class SealLocationInfo  implements Serializable {
    private static final long serialVersionUID = -8706741125508276806L;
    private Integer posType;//定位或关键字
    private float posX;
    private float posY;
    private String signOnPage;
    private Long sealId;
    private String key;
    private float width;
    private Integer signType;//2.骑缝章  1.其他
}

测试直接使用下标方式请求

直接使用属性下标的方式传递

请求:

示例代码:

@PostMapping(value = "/upload/multiple")
public ResponseEntity<ResponseResult<List<Object>>> uploadMultiple1213Batch(
    MultipartFile pdfFile,
    //            @ModelAttribute("request")
    List<SealLocationInfoRequest> request) throws Exception {
    //            @RequestParam("hosts") SealLocationInfoRequest hosts) throws Exception {
    //            @ModelAttribute("hosts") SealLocationInfoRequest hosts) throws Exception {
    return OpsResponse.ok(null);
}

结果:

java.lang.IllegalStateException: No primary or single unique constructor found for interface java.util.List

结果明显不适配报错

测试二使用对象包裹的方式传输

@PostMapping(value = "/upload/multiple")
    public ResponseEntity<ResponseResult<List<Object>>> uploadMultiple1213Batch(
            MultipartFile pdfFile,
//            @ModelAttribute("request")
//            List<SealLocationInfoRequest> request) throws Exception {
//            @RequestParam("hosts") SealLocationInfoRequest hosts) throws Exception {
             SealLocationInfoRequest hosts) throws Exception {
        return OpsResponse.ok(null);
    }

请求体

curl的方式

curl --location 'http://localhost:8088/upload/record/upload/multiple' \
--header 'Content-Type: multipart/form-data' \
--header 'Accept: */*' \
--header 'Authorization: acf179d575a7492fbbf5deefbdc69fbd' \
--header 'from-service: trade-gateway' \
--header 'gateway_header: 2131321' \
--header 'traceId: 12312' \
--form 'sealLocationInfoList[0].posX="123213"'

头一次发现还可以使用这种方式,就像json传输一样,不过需要手动设置下标,对了,文件也可以这样传输,可以放对象里面也可以放外面,但是属性名字一样会双重注入。

SpringBoot的接收

1. 使用@RequestParam注解来接收表单数据中的数组对象。

以下是一个示例:

@PostMapping("/example")
public ResponseEntity<String> handleFormData(@RequestParam("objects") List<Object> objects) {
    // 处理接收到的对象数组
    return ResponseEntity.ok("Received " + objects.size() + " objects");
}

在上面的示例中,我们使用@RequestParam注解来声明我们要接收名为objects的表单参数,并将其映射到一个List<Object>类型的变量中。

2. 如果你的对象是一个自定义类,您可以使用@ModelAttribute注解来将表单数据映射到该类的实例中。以下是一个示例:

@PostMapping("/example")
public ResponseEntity<String> handleFormData(@ModelAttribute("customObject") CustomObject[] customObjects) {
    // 处理接收到的自定义对象数组
    return ResponseEntity.ok("Received " + customObjects.length + " custom objects");
}

在上面的示例中,我们使用@ModelAttribute注解来声明我们要接收名为customObject的表单参数,并将其映射到一个CustomObject[]类型的变量中。

3. `x-www-form-urlencoded` 和 `form-data` 协议的区别

`x-www-form-urlencoded` 和 `form-data` 是 HTTP 请求中常用的两种表单数据编码方式。

`x-www-form-urlencoded` 是默认的编码方式,它会将表单数据转换为键值对,并使用 `&` 符号进行分隔,然后将键值对以 `key1=value1&key2=value2` 的形式进行编码。这种编码方式通常用于较小的表单数据,如登录表单等。

而 `form-data` 则是一种更加灵活的编码方式,它可以处理二进制数据(如图片、文件等)以及文本数据。它会将每个表单字段封装成一个独立的部分,每个部分都可以设置自己的 Content-Type,这样就可以支持发送多个文件或者多个键值对。这种编码方式通常用于上传文件等操作。

总结

传输数组队列不需要使用注解,在测试传输中不写注解反而能通过写了,写了@RequestPart注解反而通过不了,具体细节之后更新细则讲解,这篇主要讲解协议和请求,主要解决了表单形式传输对象的问题。

参考资料

Difference Between form-data, x-www-form-urlencoded and raw in Postman | Baeldung

Forms in HTML documents

javascript - appending array to FormData and send via AJAX - Stack Overflow

使用formData向后台传递数组对象

到此这篇关于SpringBoot处理form-data表单接收对象数组的文章就介绍到这了,更多相关SpringBoot接收对象数组内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 简单介绍一下什么是microservice微服务

    简单介绍一下什么是microservice微服务

    这篇文章主要介绍了一下什么是microservice微服务微服务的定义,微服务到底是什么意思?什么样的架构可以叫做微服务?这篇文章可以给你答案
    2023-03-03
  • Java数据存储的“双子星”对决(Map和Set的区别)

    Java数据存储的“双子星”对决(Map和Set的区别)

    文章主要介绍了Java中Map和Set两种数据结构的定义、实现、方法及应用场景,Map用于存储键值对,键唯一,值可重复;Set用于存储唯一元素,无序,两者都提供了丰富的操作方法,如添加、删除、查找等,感兴趣的朋友一起看看吧
    2025-02-02
  • Java 使用JdbcTemplate 中的queryForList发生错误解决办法

    Java 使用JdbcTemplate 中的queryForList发生错误解决办法

    这篇文章主要介绍了Java 使用JdbcTemplate 中的queryForList发生错误解决办法的相关资料,需要的朋友可以参考下
    2017-07-07
  • java集合与数组的相同点和不同点

    java集合与数组的相同点和不同点

    今天小编就为大家分享一篇关于java集合与数组的相同点和不同点,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-04-04
  • FastJSON的0day漏洞的解决

    FastJSON的0day漏洞的解决

    本文主要介绍了FastJSON的0day漏洞的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • Java实现任务管理器性能网络监控数据的方法详解

    Java实现任务管理器性能网络监控数据的方法详解

    在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些性能数据有助于优化应用程序和系统性能,本文将介绍如何使用Java编写一个简单的程序来监控网络性能数据
    2025-01-01
  • Java集合排序规则接口Comparator用法解析

    Java集合排序规则接口Comparator用法解析

    这篇文章主要介绍了Java集合排序规则接口Comparator用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • 详解SpringBoot整合MyBatis详细教程

    详解SpringBoot整合MyBatis详细教程

    这篇文章主要介绍了详解SpringBoot整合MyBatis详细教程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • 详解如何使用SpringBoot封装Excel生成器

    详解如何使用SpringBoot封装Excel生成器

    在软件开发过程中,经常需要生成Excel文件来导出数据或者生成报表,为了简化开发流程和提高代码的可维护性,我们可以使用Spring Boot封装Excel生成器,本文将介绍如何使用Spring Boot封装Excel生成器,并提供一些示例代码来说明其用法和功能
    2023-06-06
  • java多线程之Balking模式介绍

    java多线程之Balking模式介绍

    大家好,本篇文章主要讲的是java多线程之Balking模式介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01

最新评论