如何在Spring Boot POST接口中获取Syncfusion Angular日历请求负载的JSON数据
解决方案
前置配置
首先确认Spring Boot项目已经开启multipart请求支持,Spring Boot 2.x+版本默认开启,无需额外配置,若手动关闭过可在application.properties中添加如下配置:
spring.servlet.multipart.enabled=true
实现代码
你可以选择以下两种方案中的任意一种实现JSON提取:
方案1:直接解析请求体(快速实现)
适合场景:仅需处理Syncfusion Calendar的固定batch请求格式,实现成本低
import com.fasterxml.jackson.databind.ObjectMapper; import java.util.stream.Collectors; import java.nio.charset.StandardCharsets; @RequestMapping(value = "/appointment/{batch}" , method = RequestMethod.POST, consumes = "multipart/mixed") public ResponseEntity<?> addAppointment(@PathVariable Map batch,HttpServletRequest request) throws IOException { // 读取完整请求体内容 String requestBody = request.getReader() .lines() .collect(Collectors.joining(System.lineSeparator())); // 提取JSON字符串:匹配第一个{到最后一个}的区间 int jsonStartIndex = requestBody.indexOf('{'); int jsonEndIndex = requestBody.lastIndexOf('}'); if (jsonStartIndex < 0 || jsonEndIndex < 0) { return ResponseEntity.badRequest().body("无效请求,未找到目标JSON数据"); } String jsonContent = requestBody.substring(jsonStartIndex, jsonEndIndex + 1); // 转换为自定义实体类(AppointmentDTO字段需和JSON字段一一对应) ObjectMapper objectMapper = new ObjectMapper(); AppointmentDTO appointment = objectMapper.readValue(jsonContent, AppointmentDTO.class); // 后续业务逻辑处理... return ResponseEntity.ok("预约添加成功"); } // 自定义预约实体类示例 class AppointmentDTO { private String Subject; private String StartTime; private String EndTime; private Boolean IsAllDay; private String StartTimezone; private String EndTimezone; private String RecurrenceRule; private Integer Id; // 省略getter、setter方法 }
方案2:标准Multipart解析(规范可扩展)
适合场景:后续可能兼容其他batch请求,遵循HTTP multipart解析规范
import org.springframework.web.multipart.MultipartHttpServletRequest; import javax.servlet.http.Part; import com.fasterxml.jackson.databind.ObjectMapper; import java.nio.charset.StandardCharsets; @RequestMapping(value = "/appointment/{batch}" , method = RequestMethod.POST, consumes = "multipart/mixed") public ResponseEntity<?> addAppointment(@PathVariable Map batch,HttpServletRequest request) throws IOException { if (!(request instanceof MultipartHttpServletRequest)) { return ResponseEntity.badRequest().body("请求格式错误"); } MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request; AppointmentDTO appointment = null; ObjectMapper objectMapper = new ObjectMapper(); // 遍历所有multipart分段 for (Part part : multiRequest.getParts()) { String partContent = new String(part.getInputStream().readAllBytes(), StandardCharsets.UTF_8); int jsonStartIndex = partContent.indexOf('{'); int jsonEndIndex = partContent.lastIndexOf('}'); if (jsonStartIndex >= 0 && jsonEndIndex >= 0) { String jsonContent = partContent.substring(jsonStartIndex, jsonEndIndex + 1); appointment = objectMapper.readValue(jsonContent, AppointmentDTO.class); break; } } if (appointment == null) { return ResponseEntity.badRequest().body("未提取到有效预约数据"); } // 后续业务逻辑处理... return ResponseEntity.ok("预约添加成功"); }
注意事项
- 上述两种方案对于Syncfusion Calendar的固定batch请求格式均可用,无需修改前端配置
- 若JSON中存在嵌套的
{}结构,可替换为正则表达式匹配合法JSON字符串,普通场景下直接提取首尾{}的逻辑足够稳定
内容的提问来源于stack exchange,提问作者Niraj Singh
相关产品推荐
相关产品推荐

