Spring Boot RestController中如何将JSON映射至包装类内的EnumMap
解决方案
1. 修正Task类的字段映射问题
JSON中的字段是allotedTime,但Task类中定义的alottedTime存在拼写差异,需通过@JsonProperty注解明确映射关系:
@Data public class Task { private String name; @Min(value = 0, message = "Time should not be less than 0") @JsonProperty("allotedTime") // 匹配JSON中的键名 private int alottedTime; }
2. 解决WrapperClass与JSON结构不匹配的问题
当前JSON直接以星期名称为顶级键,而WrapperClass的taskList字段需要对应嵌套对象,有两种处理方式:
方式一:调整JSON结构(推荐,符合封装规范)
修改请求JSON,将所有星期数据嵌套在taskList键下,与WrapperClass的字段名对应:
{ "taskList": { "monday": [ { "name": "task1", "allotedTime": 15 } ], "tuesday": [ { "name": "open", "allotedTime": 20 }, { "name": "close", "allotedTime": 60 } ] } }
这种方式下原WrapperClass无需额外修改,Jackson会自动将taskList节点内容映射到EnumMap中(默认支持将小写星期字符串转换为DayOfWeek枚举常量)。
方式二:不修改JSON,通过注解适配WrapperClass
如果无法调整请求JSON结构,可在WrapperClass中添加@JsonAnySetter方法,将顶级键转换为DayOfWeek枚举并填充到EnumMap:
@Data public class WrapperClass { private EnumMap<DayOfWeek, List<Task>> taskList = new EnumMap<>(DayOfWeek.class); @JsonAnySetter public void setTaskByDay(String dayStr, List<Task> tasks) { // 将小写星期字符串转为枚举常量的大写形式 DayOfWeek day = DayOfWeek.valueOf(dayStr.toUpperCase()); taskList.put(day, tasks); } }
注意提前初始化EnumMap避免null,通过toUpperCase()完成枚举值的大小写转换。
3. 修正控制器参数绑定
确保BindingResult与@Valid修饰的参数相邻:
@PostMapping("/taskApi") public ResponseEntity<String> createTaskList(@Valid @RequestBody WrapperClass wrapperclass, BindingResult result) { if (result.hasErrors()) { return ResponseEntity.badRequest().body("Invalid request: " + result.getAllErrors()); } // 业务逻辑处理 return ResponseEntity.ok("Tasks received successfully"); }
内容的提问来源于stack exchange,提问作者aswathy
相关产品推荐
相关产品推荐

