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

无需创建实体类,如何安全接收AJAX POST传递的数组与变量?

如何在不创建实体类的情况下接收AJAX POST的JSON参数

首先得指出你后端代码里的核心问题:

  1. 不能同时使用多个@RequestBody——一个HTTP请求只有一个请求体,Spring MVC不知道该把请求体映射到哪个参数上,这会直接导致报错。
  2. @RequestParam是用来获取URL查询参数或表单(application/x-www-form-urlencoded)参数的,而你前端发的是application/json格式的请求体,所以这个注解根本取不到值。

下面给你两种不用创建实体类就能正确获取参数的方案:

方案一:用Map<String, Object>接收整个JSON请求体

Spring MVC可以直接把JSON请求体转换成Map,你只需要根据key取出对应的值再做类型转换即可:

import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import java.util.List;
import java.util.Map;

@RequestMapping(value="/gadbook/bookid/updatebooking/", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
public AjaxDataTransfer updateBooking(@RequestBody Map<String, Object> requestData) {
    // 提取数组参数,强转为List
    List<Integer> rooms = (List<Integer>) requestData.get("rooms");
    // 提取数值型参数,做类型转换
    long bookingId = Long.parseLong(requestData.get("bookingId").toString());
    long status = Long.parseLong(requestData.get("status").toString());

    // 这里可以写你的业务逻辑
    System.out.println("Booking ID: " + bookingId);
    System.out.println("Status: " + status);
    System.out.println("Rooms list: " + rooms);

    return new AjaxDataTransfer(...); // 返回你的响应对象
}

方案二:用Jackson的JsonNode解析JSON(更灵活)

如果你的项目已经集成了Jackson(Spring Boot默认自带),用JsonNode可以更灵活地解析JSON结构,尤其是处理数组的时候:

import com.fasterxml.jackson.databind.JsonNode;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import java.util.ArrayList;
import java.util.List;

@RequestMapping(value="/gadbook/bookid/updatebooking/", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
public AjaxDataTransfer updateBooking(@RequestBody JsonNode requestData) {
    // 解析数组参数
    JsonNode roomsNode = requestData.get("rooms");
    List<Integer> rooms = new ArrayList<>();
    if (roomsNode.isArray()) {
        for (JsonNode roomNode : roomsNode) {
            rooms.add(roomNode.asInt());
        }
    }

    // 解析数值参数
    long bookingId = requestData.get("bookingId").asLong();
    long status = requestData.get("status").asLong();

    // 业务逻辑处理
    System.out.println("Booking ID: " + bookingId);
    System.out.println("Status: " + status);
    System.out.println("Rooms list: " + rooms);

    return new AjaxDataTransfer(...);
}

前端代码的小提醒

你的前端代码基本没问题,只需要确保<%=path %>能正确渲染成项目的上下文路径,另外contentType: "application/json"的设置是正确的,不用修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:57:19