Is there a solution about Gson “circular reference”?

流过昼夜 提交于 2019-12-01 04:08:12

As far as I know there is no automated solution for circular references in Gson. The only JSON-producing library I know of that handles circular references automatically is XStream (with Jettison backend).

EDIT: Jackson also supports handling of circular references with @JsonIdentityInfo annotation; so while not automatic (you do need to mark references that need Object Id handling), it does allow solving most cases.

Since Gson doesn't properly handle circular references, and in some cases you may need to call the parent entity from its child, you can do this. Say we have:

@Entity
@Table(name = "servers_postgres")
public class PostgresServer implements Serializable {

    public PostgresServer() {
        this.tables = new ArrayList<>();
    }

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id_server")
    private Integer serverId;

    @OneToMany(orphanRemoval = true, mappedBy = "server", fetch = FetchType.EAGER)
    @Cascade(org.hibernate.annotations.CascadeType.ALL)
    private List<PostgresTable> tables;

    @Column(length = 250)
    private String serverAddress;

    @Column(length = 250)
    private String name;
}

and

@Entity
@Table(name = "postgres_tables")
    public class PostgresTable implements Serializable {

        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "id_table")
        private Integer tableId;

        @Column(length = 250)
        private String name;

        @ManyToOne()
        @JoinColumn(name = "id_server", foreignKey = @ForeignKey(name = "fk_postgres_tables"))
        private PostgresServer server;
    }

In this case, you may need to get a PostgresServer reference from a PostgresTable entity. So, instead of excluding PostgresServer from serialization, you simply set its List of tables to null. For example:

//Assuming a List<PostgresTable>...
postgresTables.forEach(postgresTable -> postgresTable.getServer().setTables(null));

This is how i solve circular references with Gson. Hope that helps someone.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!