Spring Boot接收Angular表单提交时Group实体JSON反序列化错误如何解决
问题解决方案
1. 前端提交数据反序列化Group失败问题
错误原因
Jackson反序列化时收到的group字段是JSON字符串格式(如"{\"idGrp\": 2,\"nomGroup\": \"intranet\"}"),而非JSON对象格式,没有对应的String参数构造方法可以完成字符串到Group实体的转换,因此抛出异常。
解决方案
优先调整前端请求格式
Angular侧提交表单时,不要将group对象序列化后再塞入Employe参数,直接传嵌套的JSON对象即可,正确请求体示例:
{ "matricule": 1, "nom": "测试", "prenom": "用户", // 其余Employe字段 "group": { "idGrp": 2, "nomGroup": "intranet" } }
后端兼容方案(无需修改前端)
- 为
Group类补充所有私有属性的getter、setter方法,Jackson反序列化需要访问私有属性 - 为
Group类新增String参数构造方法,内部完成JSON字符串解析:
// 引入com.fasterxml.jackson.core.JsonProcessingException、com.fasterxml.jackson.databind.ObjectMapper public Group(String jsonStr) throws JsonProcessingException { Group temp = new ObjectMapper().readValue(jsonStr, Group.class); this.idGrp = temp.getIdGrp(); this.NomGroup = temp.getNomGroup(); }
补充注意:你的Employe类中带Group参数的构造方法未对group属性赋值,需要补充this.group = group;否则构造出的对象group字段会为null。
2. CommandLineRunner启动报错问题
错误原因
你误用了getResourceAsStream方法,该方法是用来读取类路径下的资源文件的,你传入序列化后的JSON字符串作为参数,找不到对应的资源因此返回null,后续readValue方法传入null参数就抛出了src is null异常,你当前的CommandLineRunner逻辑完全没有必要绕一层序列化/反序列化。
修复后的代码示例
如果是测试新增员工逻辑,直接构造对象调用服务即可:
@Bean public CommandLineRunner run(ServiceEmp serviceEmp) { return args->{ Group testGroup = new Group(2L, "intranet"); // 调用带Group参数的构造方法 Employe e = new Employe(0,"","","","",0,"","",0,0,"","", testGroup); serviceEmp.addEmp(e); System.out.println("saved"); }; }
如果需要测试JSON反序列化逻辑,直接处理字符串即可,不需要读取资源:
@Bean public CommandLineRunner run(ServiceEmp serviceEmp) { return args->{ String testJson = "{\"nom\":\"测试\",\"prenom\":\"用户\",\"group\":{\"idGrp\":2,\"nomGroup\":\"intranet\"}}"; ObjectMapper objectMapper = new ObjectMapper(); Employe e = objectMapper.readValue(testJson, Employe.class); serviceEmp.addEmp(e); System.out.println("saved"); }; }
内容的提问来源于stack exchange,提问作者Takwa
相关产品推荐
相关产品推荐

