如何通过AJAX将JSON格式DataTable数据传递到Java MVC控制器
问题解决方案
问题根源
前端调用tableToJSON生成的是对象数组,直接作为data传入$.ajax时,jQuery会将其转换为application/x-www-form-urlencoded格式的表单参数,复杂嵌套结构无法被后端@RequestParam注解正确解析;直接调用toString()只会将JS对象转为[object Object]字符串,无法传递有效数据。
前端修改方案
将请求参数整体序列化为JSON字符串,声明请求体格式为JSON:
$(document).ready(function(){ $('#mov').click(function(){ var dni = parseInt($('#dni').val()); var table = $('#tablaSeleccionados').tableToJSON(); // 封装参数并序列化为JSON字符串 var requestData = JSON.stringify({ dni: dni, table: table }); $.ajax({ type:'POST', url:'${pageContext.request.contextPath}/saveMovBienes', data: requestData, contentType: 'application/json;charset=utf-8', // 声明请求体为JSON格式 dataType: "json" // 若后端返回空字符串可改为"text"避免解析报错 }) }) })
后端修改方案
用@RequestBody注解接收整个JSON请求体,可选两种实现方式:
方案1:新建DTO类接收(更规范)
首先新增请求参数映射类:
import java.util.List; import java.util.Map; // 没有Lombok就自行添加getter、setter方法 import lombok.Data; @Data public class MovBienesRequest { private Integer dni; // 若已知table的字段结构,可将Map替换为对应实体类 private List<Map<String, Object>> table; }
修改Controller代码:
@PostMapping("/saveMovBienes") public String saveMovBienes(@RequestBody MovBienesRequest request) { Integer dni = request.getDni(); List<Map<String, Object>> listado = request.getTable(); System.out.println("PER_ID= "+dni); System.out.println("LIST= "+ listado); return ""; }
方案2:用Map直接接收(无需新建类)
@PostMapping("/saveMovBienes") public String saveMovBienes(@RequestBody Map<String, Object> params) { Integer dni = (Integer) params.get("dni"); List<Map<String, Object>> listado = (List<Map<String, Object>>) params.get("table"); System.out.println("PER_ID= "+dni); System.out.println("LIST= "+ listado); return ""; }
验证注意事项
- 确认Spring项目已引入
jackson-databind依赖(Spring Boot web起步依赖默认已包含),用于解析JSON请求体 - 可通过浏览器开发者工具的Network面板查看请求的Request Payload,确认传输的JSON格式正确
内容的提问来源于stack exchange,提问作者Juano Cataldo
相关产品推荐
相关产品推荐

