Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在SpringMVC中为两个不同的API使用两个不同的自定义序列化程序序列化POJO?_Java_Spring Mvc_Jsonserializer_Java Custom Serialization - Fatal编程技术网

Java 如何在SpringMVC中为两个不同的API使用两个不同的自定义序列化程序序列化POJO?

Java 如何在SpringMVC中为两个不同的API使用两个不同的自定义序列化程序序列化POJO?,java,spring-mvc,jsonserializer,java-custom-serialization,Java,Spring Mvc,Jsonserializer,Java Custom Serialization,我正在使用SpringMVC创建RESTfulAPI。我有两个不同的API端点,需要以两种不同的方式序列化相同的POJO。我已在下面说明了同样的情况: 课程API url - /course/{id} response - { "id": "c1234", "name": "some-course", "institute": { "id": "i1234", "name": "XYZ College" } } 我的课程Pojo

我正在使用SpringMVC创建RESTfulAPI。我有两个不同的API端点,需要以两种不同的方式序列化相同的POJO。我已在下面说明了同样的情况:

课程API

url - /course/{id}

response - {
    "id": "c1234",
    "name": "some-course",
    "institute": {
        "id": "i1234",
        "name": "XYZ College"
    }
}
我的
课程
Pojo与上述结构一致,因此默认序列化工作

class Course {
    private String id;
    private String name;
    private Institute institute;

    //getters and setters follow
}

class Institute {
    private String id;
    private String name;

    //getters and setters follow
}
现在,对于另一个
学生
API

url - /student/{id}

response - {
    "id":"s1234",
    "name":"Jon Doe",
    "institute": {
        "id": "i1234",
        "name": "XYZ college"
    },
    "course": {
        "id": "c1234",
        "name": "some-course"
    }
}
我的
学生
课看起来像这样:

class Student {
    private String id;
    private String name;
    private Course course;

    //getters and setters follow
}
请注意,
Student
类中没有
institute
属性,因为institute可以通过
课程。getInstitute
getter传递确定。但这最终形成了一个类似于CourseAPI的序列化结构。如何在不修改POJO结构的情况下,仅对Students API使用自定义序列化


我想到了N个解决方案,这是我想知道的最优雅和最喜欢的解决方案。

我想这是我挑选出来的最优雅的解决方案,对我来说最合适

所以,这是我的班级
Student

class Student {

    private String id;
    private String name;

    @JsonIgnoreProperties({"institute"})
    private Course course;

    //getters and setters

    //Adding one more getter
    public Institute getInstitute() {
        return this.course.getInstitute();
    }
}

这样,我通过一个
getter
公开了一个JavaBean属性
institute
,而在我的
Student
对象中没有对它的引用。

我看到的第一个问题是
课程
不应该是
字符串。精确的建模可能会帮你解决这个问题。@chrylis-Oh。。这是一个打字错误,它是
课程
的类型,而不是
字符串
。已对其进行编辑。此格式是否为特定的外部要求?似乎它做出了不必要的假设,并且可以通过使REST API符合域模型来简化。对于外部世界来说,说学生在XYZ学院学习比说学生在正在运行某门课程的学院学习(唯一)更直观。因此,API更注重直观的建模。那么,也许你应该使用类似Jackson的ID序列化,你可以告诉它第一次只序列化一个特定的对象(the
Institute
),然后通过ID引用它。