无需创建实体类,如何安全接收AJAX POST传递的数组与变量?
如何在不创建实体类的情况下接收AJAX POST的JSON参数
首先得指出你后端代码里的核心问题:
- 不能同时使用多个
@RequestBody——一个HTTP请求只有一个请求体,Spring MVC不知道该把请求体映射到哪个参数上,这会直接导致报错。 @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
相关产品推荐
相关产品推荐

