springmvc的注解@requestBody自动封装复杂对象?

springmvc的注解@requestBody可以通过页面提交json来自动封装成bean对象,但是如果这样的怎么处理

public class User{
    private String id;
    private int age;
    private String name;
    private Class classInfo;
    //getter,setter
}
public class ClassInfo{
    private String id;
    private name;
    private User classMaster;
    private School school;
    @JsonIgnore
    private Set<User> teachers;
    //getter,setter
    
}
public class School{
    private String id;
    private String name;
    //getter,setter
}

我封装的json对象是

"classInfo":{
    "id":"xxxxx",
    "name":"一年级三班",
    //班主任
    "classMaster":{
        "id":"xxxx",
        "age":"92",
        "name":"班主任"
    },
    //学校
    "school":{
        "id":"xxx",
        "name":"旭日东升小学"
    },
    //教师集合
    "teachers":[
        {
             "id":"xxxx",
            "age":"92",
            "name":"语文老师"
        },
        {
             "id":"xxxx",
            "age":"92",
            "name":"数学老师"
        }
    ]
}

提交的时候data : JSON.stringify(classInfo)
这样的班级里面包含了班主任,教师集合,还有学校,后台是这样的

@requestMapping("xxxx")
@responseBody
public Map<String,Object> addClass(Model model, @requestBody ClassInfo classInfo){
    xxxx
}

这个时候classInfo的数据可以收的到,但是对应的无论是依赖对象还是集合属性,都是null,请问这种情况怎么处理,是不是json的格式不太对
spring3.2.8的

阅读 18k
3 个回答

初步看应该是JSON格式有问题,多了一层,针对实体ClassInfo的JSON格式应该是:

{
    "id": "xxxxx",
    "name": "一年级三班",
    "classMaster": {
        "id": "xxxx",
        "age": "92",
        "name": "班主任"
    },
    "school": {
        "id": "xxx",
        "name": "旭日东升小学"
    },
    "teachers": [
        {
            "id": "xxxx",
            "age": "92",
            "name": "语文老师"
        },
        {
            "id": "xxxx",
            "age": "92",
            "name": "数学老师"
        }
    ]
}

我不知道说点什么,因为你说的两个东西都是我们项目组刚刚放弃的,其一是 JavaBean,系统中已经把所有的JavaBean消灭了(除了用户User),原因是虽然是一个普通的Java类但是项目大了难以维护,有没有想过数据库表字段增加,修改的,删除的情况,所以我们都是使用Map,其二是你纠结的 @RequestBody, 我们系统一开始也是用这个注解来获取请求体的参数,但是现在决定不用了,因为 request 的 流 一旦获取就不能 reset ,也就是下次你手动去拿 request 的请求体时,流是关闭的或者是读到最末尾了。对于你提的问题,我们都是把它读到一个Map里面,JavaBean没有试过。

估计没有帮助到你,但是还是想分享一下自己的想法。

osc learn_more

我记得,我之前也遇到过类似问题,就是类的层次比较多的时候,一层嵌套一层,也出现了自动封装之后得不到参数值的情况,spring默认的转换jackson,理论上是没问题的,可以用它的转换类写个测试。记得我后来复杂的类就没有用spring mvc自动封装json,而是取到json串之后自己转的。