Jeśli używasz GSON do konwersji klasy Java na JSON, możesz uniknąć pól, które powodują odwołanie cykliczne i pętlę bezokolicznika, wystarczy umieścić adnotację @Expose w polach, które mają się pojawić w JSON, a pola bez adnotacja @Expose nie pojawia się w JSON.
Cykliczne odwołanie pojawia się na przykład, jeśli próbujemy serializować klasę User za pomocą tras pól klasy Route, a klasa Route ma użytkownika pola klasy User, wtedy GSON próbuje serializować klasę User i gdy próbuje serializować trasy, serializuj klasę Route, aw klasie Route spróbuj zserializować użytkownika pola i ponownie spróbuj serializować klasę User, istnieje cykliczne odwołanie, które wywołuje bezokolicznikową pętlę. Pokazuję wspomnianą klasę User i Route.
import com.google.gson.annotations.Expose;
Użytkownik klasy
@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;
Trasa klasowa
@Entity
@Table(name = "route")
public class Route {
@ManyToOne()
@JoinColumn(nullable = false, name = "id_user", foreignKey =
@ForeignKey(name = "c"))
private User user;
Aby uniknąć nieskończonej pętli, używamy adnotacji @Expose, która oferuje GSON.
Pokazuję w formacie JSON wynik serializacji z GSON klasy User.
{
"name": "ignacio"
}
Widzimy, że pole route i polubienia nie istnieje w formacie JSON, tylko nazwa pola. Z tego powodu unika się cyklicznego odniesienia.
Jeśli chcemy z tego skorzystać, musimy w określony sposób stworzyć obiekt GSON.
Gson converterJavaToJson = new GsonBuilder().setPrettyPrinting().excludeFieldsWithoutExposeAnnotation().create();
Na koniec przekształcamy klasę java modelu hibernującego użytkownika za pomocą utworzonego konwertera GSON.
User user = createUserWithHibernate();
String json = converterJavaToJson.toJson(user);