You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过AJAX将多个JSON对象传递至Spring控制器?

嘿,看你的代码是想把表单里的用户、员工、地址数据分别封装成三个JSON对象传给Spring后端对吧?目前代码里有几个小问题得调整下,我给你一步步梳理修正方案:

解决多JSON对象通过AJAX传递到Spring控制器的问题

一、前端代码修正

1. 完善HTML表单(给字段添加明确的命名)

首先得让表单字段有清晰的命名,方便我们分组提取对应对象的数据:

<html lang="en">
<head>
    <title>Registration Form</title>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
    <form id="frm_details">
        <!-- User相关字段 -->
        <input type="text" name="userName" placeholder="用户名" required>
        <input type="email" name="userEmail" placeholder="邮箱" required>
        
        <!-- Employee相关字段 -->
        <input type="text" name="empId" placeholder="员工ID" required>
        <input type="text" name="empDepartment" placeholder="所属部门" required>
        
        <!-- Address相关字段 -->
        <input type="text" name="addrStreet" placeholder="街道地址" required>
        <input type="text" name="addrCity" placeholder="城市" required>
        <input type="text" name="addrZip" placeholder="邮编" required>
        
        <button type="submit">提交注册</button>
    </form>
</body>
</html>

2. 修正JavaScript代码(正确构建多对象JSON)

你之前的代码直接用了user、employee、address变量但没定义,而且serialize()生成的是表单编码字符串,和contentType: "application/json"不匹配。现在我们手动从表单提取数据,构建对应对象再发送:

<script>
$(document).ready(function() {
    $("#frm_details").on("submit", function(event) {
        event.preventDefault();
        
        // 从表单提取数据,分别构建三个对象
        var user = {
            name: $("input[name='userName']").val(),
            email: $("input[name='userEmail']").val()
        };
        
        var employee = {
            empId: $("input[name='empId']").val(),
            department: $("input[name='empDepartment']").val()
        };
        
        var address = {
            street: $("input[name='addrStreet']").val(),
            city: $("input[name='addrCity']").val(),
            zipCode: $("input[name='addrZip']").val()
        };
        
        // 把三个对象包装成一个顶层请求对象
        var requestData = {
            user: user,
            employee: employee,
            address: address
        };
        
        $.ajax({
            url: "/saveUser",
            type: "post",
            contentType: "application/json",
            data: JSON.stringify(requestData), // 序列化顶层对象为JSON字符串
            dataType: 'json',
            success: function(response) {
                location.replace("index.html");
            },
            error: function(xhr, status, error) {
                console.error("注册请求失败:", error);
                alert("注册失败,请稍后重试");
            }
        });
    });
});
</script>

二、Spring后端对应配置

1. 创建实体/DTO类

后端需要创建对应的类来接收前端的JSON数据,注意字段名要和前端JSON的键完全一致(大小写敏感):

// User类
public class User {
    private String name;
    private String email;
    
    // 无参构造、全参构造、getter/setter(建议用Lombok简化代码)
    public User() {}
    public User(String name, String email) {
        this.name = name;
        this.email = email;
    }
    
    // getter和setter方法省略
}

// Employee类
public class Employee {
    private String empId;
    private String department;
    
    // 无参构造、全参构造、getter/setter
}

// Address类
public class Address {
    private String street;
    private String city;
    private String zipCode;
    
    // 无参构造、全参构造、getter/setter
}

// 包装类:用来接收整个请求体的顶层对象
public class UserRegistrationRequest {
    private User user;
    private Employee employee;
    private Address address;
    
    // 无参构造、全参构造、getter/setter
}

2. 编写Spring控制器方法

在控制器中添加接收请求的方法,用@RequestBody注解自动将JSON转换为Java对象:

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {
    
    @PostMapping("/saveUser")
    public String saveUser(@RequestBody UserRegistrationRequest request) {
        // 提取三个对象进行业务处理
        User user = request.getUser();
        Employee employee = request.getEmployee();
        Address address = request.getAddress();
        
        // 这里可以调用Service层执行保存逻辑
        // userService.save(user);
        // employeeService.save(employee);
        // addressService.save(address);
        
        return "{\"status\":\"success\"}"; // 返回JSON格式的成功响应
    }
}

关键注意事项

  • 确保前端JSON的键名和后端Java类的属性名完全匹配,否则Jackson无法自动映射
  • Spring Boot项目默认已经包含Jackson依赖,无需额外引入;如果是普通Spring项目,需要手动添加Jackson依赖
  • 如果表单字段很多,可以用serializeArray()批量处理表单数据,再映射到对应对象,减少重复代码

内容的提问来源于stack exchange,提问作者Rajesh kumar Nayak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:59:42