Java 如何在SpringMVC中为两个不同的API使用两个不同的自定义序列化程序序列化POJO?
我正在使用SpringMVC创建RESTfulAPI。我有两个不同的API端点,需要以两种不同的方式序列化相同的POJO。我已在下面说明了同样的情况: 课程APIJava 如何在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
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序列化,你可以告诉它第一次只序列化一个特定的对象(theInstitute
),然后通过ID引用它。