Якщо ви використовуєте GSON для перетворення класу Java в JSON, ви можете уникнути полів, що викликають циклічну посилання та інфінітивний цикл, вам потрібно лише помістити анотацію @Expose у поля, які ви хочете відобразити в JSON, а поля без анотація @Expose не відображається в JSON.
Циклічне посилання з'являється, наприклад, якщо ми намагаємося серіалізувати клас User за допомогою польових маршрутів класу Route, а клас Route має польового користувача класу User, то GSON намагається серіалізувати клас User і при спробі серіалізувати маршрути, серіалізувати клас Route і в класі Route спробувати серіалізувати польового користувача, і знову спробувати серіалізувати клас User, є кругова посилання, що провокує інфінітивний цикл. Я показую згаданий клас User and Route.
import com.google.gson.annotations.Expose;
Користувач класу
@Entity
@Table(name = "user")
public class User {
@Column(name = "name", nullable = false)
@Expose
private String name;
@OneToMany(mappedBy = "user", fetch = FetchType.EAGER)
@OnDelete(action = OnDeleteAction.CASCADE)
private Set<Route> routes;
@ManyToMany(fetch = FetchType.EAGER)
@OnDelete(action = OnDeleteAction.CASCADE)
@JoinTable(name = "like_", joinColumns = @JoinColumn(name = "id_user"),
inverseJoinColumns = @JoinColumn(name = "id_route"),
foreignKey = @ForeignKey(name = ""),
inverseForeignKey = @ForeignKey(name = ""))
private Set<Route> likes;
Класний маршрут
@Entity
@Table(name = "route")
public class Route {
@ManyToOne()
@JoinColumn(nullable = false, name = "id_user", foreignKey =
@ForeignKey(name = "c"))
private User user;
Щоб уникнути інфінітивного циклу, ми використовуємо анотацію @Expose, що пропонує GSON.
Я показую у форматі JSON результат серіалізації за допомогою GSON класу User.
{
"name": "ignacio"
}
Ми бачимо, що маршрут поля та лайки не існують у форматі JSON, лише назва поля. Через це кругового посилання уникати.
Якщо ми хочемо цим скористатися, ми повинні створити об'єкт GSON певним чином.
Gson converterJavaToJson = new GsonBuilder().setPrettyPrinting().excludeFieldsWithoutExposeAnnotation().create();
Врешті-решт, ми перетворюємо Java-клас моделі сплячого користувача за допомогою створеного перетворювача GSON.
User user = createUserWithHibernate();
String json = converterJavaToJson.toJson(user);