使用 ajax 将 formData 发送到 spring 服务器时如何添加对象列表

How to add list of objects when sending formData to a spring server with ajax

提问人:jadekim 提问时间:9/6/2023 最后编辑:jadekim 更新时间:9/6/2023 访问量:74

问:

objs 值在如下编写的代码中为 null。我尝试了各种方法,但结果是 objs 为 null。如何在FormData中添加对象列表?

在“网络”选项卡上检查有效负载时,objs 如下所示。

obj[0]: {"name":"n1", "age":10}
obj[1]: {"name":"n2", "age":20}

此外,当我检查 from 和 时,objs 的值如下。HttpServletRequest requestrequest.getParameterMap()

["{"name":"n1", "age":10}", "{"name":"n2", "age":20}"]

JavaScript的

$('#submit-button').click(
      function () {
        var objs = [{"name":"n1", "age":10}, {"name":"n2", "age":20}];
      
        var formData = new FormData();
        formData.append("title", $('#title').val());
        formData.append("summary", $('#summary').val());
        formData.append("content", $('#content').val());
        for (var i=0; i < objs.length; i++) {
          formData.append("objs[" + i + "]", JSON.stringify(objs[i])); //this is not working
          //formData.append("objs", objs[i]); //this is not working
          //formData.append("objs[" + i + "].name", objs[i].name); //this is not working
        }

        $.ajax({
          url: "/example",
          type: "POST",
          data: formData,
          enctype: "multipart/form-data",
          contentType: false,
          processData: false
        });
      }
    )

Java Spring 中的 DTO

public record ExampleRequest(
        @NotBlank
        String title,
        @NotBlank
        String summary,
        @NotBlank
        String content,
        @NotNull
        List<OBJ> objs,
){}
public record OBJ(
    String name,
    Integer age
) {}

控制器

    @PostMapping("/example")
    public String example(
            @Validated @ModelAttribute ExampleRequest exampleRequest, //request.objs is null...
            BindingResult bindingResult
    ) {}

我希望在 javascript 中处于春季状态。帮帮我。。。var objs = [{"name":"n1", "age":10}, {"name":"n2", "age":20}];List<OBJ>

Java Ajax Spring 表单数据

评论


答:

0赞 Yusuf Khan 9/6/2023 #1

您在 Spring 后端的请求需要一个“OBJ”列表。取而代之的是,您分别提供了多个“OBJ”对象,这些对象将构造以下内容:

  • 键:“objs[0]”,值:“{”name“:”n1“, ”age“:10}
  • 键:“objs[1]”,值:“{”name“:”n2“, ”age“:20}

相反,您应该执行以下操作:

formData.append("objs", JSON.stringify(objs));

这将为您提供您想要的:

  • 键:“objs”, 值: “[{”name“:”n1“, ”age“:10}, {”name“:”n2“, ”age“:20}];”

然后,Spring 在将参数中的数据映射到预期对象时,就会知道这是一个“OBJ”列表。

此外,您正在将 multipart/form-data 用于 enctype,它适用于基于文件的请求(如文件上传)。这应该是“application/json”。

评论

0赞 jadekim 9/6/2023
感谢您的评论。正如你所说,我能够获得关键,价值。 但是 objs 在控制器上仍然有一个 null 值。key: "objs", value: "[{"name":"n1", "age":10}, {"name":"n2", "age":20}];"
0赞 Yusuf Khan 9/6/2023
我现在才注意到这一点 - 您正在使用 multipart/form-data 是您的主要问题。你不应该使用它。multipart/form-data 用于基于文件的请求(如上传)。您应该使用 application/json。