Как сериализовать POJO с двумя разными пользовательскими сериализаторами для двух разных API в Spring MVC?

Я использую Spring MVC для создания успокоительного API. У меня есть две разные конечные точки API, где мне нужно сериализовать один и тот же POJO двумя разными способами. Я проиллюстрировал то же самое ниже:

API курса

url - /course/{id}

response - {
    "id": "c1234",
    "name": "some-course",
    "institute": {
        "id": "i1234",
        "name": "XYZ College"
    }
}

мой Course 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
}

Теперь для другого Students API

url - /student/{id}

response - {
    "id":"s1234",
    "name":"Jon Doe",
    "institute": {
        "id": "i1234",
        "name": "XYZ college"
    },
    "course": {
        "id": "c1234",
        "name": "some-course"
    }
}

И мой Student класс выглядит так:

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

    //getters and setters follow
}

Обратите внимание, что нет institute недвижимость в Student класс, потому что институт может быть транзитивно определен из course.getInstitute добытчик. Но это заканчивается структурой сериализации, похожей на API курса. Как можно использовать настраиваемую сериализацию только для API учеников без изменения структуры POJO.

На мой взгляд, существует N вариантов решения, которое является наиболее элегантным и предпочтительным, я хотел бы знать.

1 ответ

Я думаю, это самая элегантная вещь, которую я выбрал, которая работает для меня.

Итак, вот мой класс 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();
    }
}

Таким образом, я выставляю свойство Java bean institute через getter пока не держит ссылку на это в моем Student Объект.

Другие вопросы по тегам