Spring Boot + Jackson: сериализация объекта различными способами в зависимости от вызываемого REST API - PullRequest
0 голосов
/ 16 октября 2018

Я занимаюсь разработкой веб-приложения Spring Boot, которое предоставляет API-интерфейсы REST, и у меня возникли проблемы с сериализацией JSON.

Допустим, у меня есть два класса A и B, которые находятся в двунаправленном отношении один-ко-многим.

Это означает, что у меня есть что-то вроде этого:

public class A {
    private List<B> bList;
    ...
}

и

public class B {
    private A owner;
    ...
}

Когда дело касается JSON-сериализации, это, конечно, цикл.

И это моя проблема:

  • В методах API, которые фокусируются на A (например, «дать мне список всех как в БД»), я бы хотелСериализация JSON, в которой:
    • A объекты содержат список B s
    • B объектов, не содержащих своего владельца A
  • В методах API, которые фокусируются на B (например, «дай мне список всех B s в БД»), я хотел бы сериализацию JSON, в которой:
    • A объекты делаютне содержат список их B s
    • B объектов, которые содержат их A владельца

Я думаю, что смогу заставить его работатьс @JsonView аннотациями, но я не думаю, что это элегантное решение.В моем приложении (которое имеет более двух классов) мне нужно было бы создать и управлять как минимум 4 или 5 JsonView: так что в моих классах модели для каждого атрибута мне пришлось бы управлять беспорядочной связкой @JsonView аннотаций.Напротив, я считаю, что модельные классы не должны осознавать тот факт, что они имеют разные представления JSON в зависимости от метода API.

Я искал, как использовать пользовательские сериализаторы JSON, и обнаружил, что Джексон позволяет делать это с помощью SimpleModule.Однако кажется, что SimpleModule не позволяет выбирать, какой сериализатор использовать в каждом конкретном случае (он просто всегда использует последний добавленный Serializer).

Так что я немного не в курсе.Кто-нибудь знает чистый способ позволить контроллерам выбирать, как сериализовать класс?

Ответы [ 3 ]

0 голосов
/ 16 октября 2018
0 голосов
/ 16 октября 2018

Вы можете использовать аннотацию @JsonIdentityInfo с объектами или использовать @JsonManagedReference, @JsonBackReference.

Вы можете даже игнорировать одну сторону отношений с @JsonIgnore или @JsonView.

Если вы хотите самостоятельно управлять сериализацией / десериализацией, используйте пользовательские реализации (например, с @JsonDeserialize).

Eugen предоставил хороший учебник по этому вопросу.

0 голосов
/ 16 октября 2018

Я думаю, что вы должны использовать DTO здесь, вы можете использовать разные DTO для разных конечных точек, и вы можете выбрать, какие поля вы хотите включить или исключить.Кроме того, вы можете украсить их, если вам это нужно.

Вот список преимуществ использования DTO в ваших конечных точках: REST API - DTO или нет?

...