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

AJAX传递JSON调用SpringBoot Controller及响应处理问题

解决AJAX传JSON到Spring Boot Controller的问题

首先咱们先理清核心问题:GET请求不适合传输JSON请求体,这是你当前代码的主要问题之一,然后再一步步调整前端和后端代码。

一、请求方法选择:用POST而非GET

GET请求的设计目的是获取资源,它会把data里的内容转换成URL查询参数,完全忽略你设置的content-type: application/json。而POST请求才是用来提交数据的,支持在请求体中传输JSON,这才符合你的需求。

二、修正前端AJAX代码

先把前端的语法错误和请求方式改过来:

<script>
database.on('child_added', function (snapshot) {
    var data = {};
    data["FirstName"] = snapshot.val().FirstName;
    data["LastName"] = snapshot.val().LastName;
    data["Number"] = snapshot.val().Number;
    $.ajax({
        type: "POST", // 改成POST请求
        contentType: "application/json",
        url: "/application/print", // 如果是跨域要写全路径,比如http://localhost:8080/application/print
        data: JSON.stringify(data),
        dataType: 'json',
        cache: false,
        success: function(response){
            console.log("Successfully sent payload", response); // 可以打印后端返回的响应内容
        },
        error: function(e){
            console.log("Error", e); // 修正原来的语法错误
        }
    });
});
</script>

三、后端Controller的修改

要接收JSON并返回响应,咱们需要做这几步:

1. 创建对应JSON结构的实体类(可选但推荐)

创建一个类来映射前端传过来的字段,这样类型更安全,也方便后续处理:

public class UserData {
    // 字段名和前端JSON的key保持一致,或者用@JsonProperty指定映射关系
    private String FirstName;
    private String LastName;
    private String Number; // 如果是数字类型可以用Integer/Long,根据你的数据来

    // 必须要有无参构造函数,Jackson需要它来实例化对象
    public UserData() {}

    // Getter和Setter方法(可以用Lombok的@Data注解一键生成)
    public String getFirstName() {
        return FirstName;
    }

    public void setFirstName(String firstName) {
        FirstName = firstName;
    }

    public String getLastName() {
        return LastName;
    }

    public void setLastName(String lastName) {
        LastName = lastName;
    }

    public String getNumber() {
        return Number;
    }

    public void setNumber(String number) {
        Number = number;
    }
}

2. 修改Controller方法

用@PostMapping接收POST请求,@RequestBody自动解析请求体的JSON到实体类,最后返回JSON响应:

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("/application")
public class AppController {

    @PostMapping("/print")
    // @RequestBody注解让Spring自动把JSON转成UserData对象
    public ResponseEntity<Map<String, Object>> handleUserData(@RequestBody UserData userData) {
        // 这里写你的业务逻辑,比如打印数据
        System.out.println("收到用户数据:");
        System.out.println("FirstName: " + userData.getFirstName());
        System.out.println("LastName: " + userData.getLastName());
        System.out.println("Number: " + userData.getNumber());

        // 准备返回给前端的响应内容
        Map<String, Object> response = new HashMap<>();
        response.put("status", "success");
        response.put("message", "数据接收并处理完成");
        response.put("receivedData", userData); // 可以把收到的数据回传给前端

        // 返回HTTP 200状态码+JSON响应
        return ResponseEntity.ok(response);
    }
}

3. 简化方案(不用实体类)

如果你不想创建实体类,也可以直接用Map<String, Object>接收JSON:

@PostMapping("/print")
public ResponseEntity<Map<String, Object>> handleUserData(@RequestBody Map<String, Object> userData) {
    System.out.println("FirstName: " + userData.get("FirstName"));
    // 其他处理逻辑...
    Map<String, Object> response = new HashMap<>();
    response.put("status", "success");
    return ResponseEntity.ok(response);
}

关键知识点说明

  • @RequestBody:必须加这个注解,Spring才会把请求体里的JSON绑定到方法参数上,Spring Boot Web Starter默认已经包含Jackson来处理JSON解析。
  • ResponseEntity:用来灵活控制HTTP状态码和响应体,比直接返回对象更灵活,比如可以返回400(参数错误)、500(服务器错误)等状态码。
  • 跨域问题:如果前端和后端不在同一域名/端口,需要在Controller上加@CrossOrigin注解解决跨域。

内容的提问来源于stack exchange,提问作者Vai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 09:12:43