2012-04-05 15 views
12

Gsonライブラリを使用して、JavaオブジェクトをJsonレスポンスに変換します。 JPA要求後、DBから取得したオブジェクトは、他のエンティティ(see my previous question)との再帰的関係のため変換できません。双方向再帰関係を削除する最も簡単な方法は?

public class Gps implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @Basic(optional = false) 
    @Column(name = "IMEI", nullable = false, length = 20) 
    private String imei; 
    //some code here... 
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "gpsImei", fetch = FetchType.LAZY) 
    private List<Coordonnees> coordonneesList; 


public class Coordonnees implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @Column(name = "IDCOORDONNEES", nullable = false) 
    private Integer idcoordonnees; 
    //some code here... 
    @JoinColumn(name = "GPS_IMEI", referencedColumnName = "IMEI", nullable = false) 
    @ManyToOne(optional = false, fetch = FetchType.LAZY) 
    private Gps gpsImei; 

私のソースコード:

EntityManagerFactory emf=Persistence.createEntityManagerFactory("JavaApplication21PU"); 
    GpsJpaController gjc=new GpsJpaController(emf); 

    Gps gps=gjc.findGps("123456789"); 

    for(int i=0;i<gps.getCoordonneesList().size();i++){ 
    gps.getCoordonneesList().get(i).setGpsImei(null); 
    } 

    Gson gson=new Gson(); 
    String json=gson.toJson(gps);//convert to json response 

    System.out.println(json); 

はあなたがここに見ることができるように私が作っ:

for(int i=0;i<gps.getCoordonneesList().size();i++){ 
    gps.getCoordonneesList().get(i).setGpsImei(null); 
    } 

のみcoordonneesList内の各GPSオブジェクトにnullを設定することにより、再帰的な関係を殺すために...

あなたの意見では、これは良い解決策である以上実用的な別の方法がありますか? ありがとう

答えて

25

円参照を含むオブジェクトをシリアル化できるGraphAdapterBuilderというGson拡張機能があります。ここで、対応するテストケースから非常に簡略化した例を示します

Roshambo rock = new Roshambo("ROCK"); 
Roshambo scissors = new Roshambo("SCISSORS"); 
Roshambo paper = new Roshambo("PAPER"); 
rock.beats = scissors; 
scissors.beats = paper; 
paper.beats = rock; 

GsonBuilder gsonBuilder = new GsonBuilder(); 
new GraphAdapterBuilder() 
    .addType(Roshambo.class) 
    .registerOn(gsonBuilder); 
Gson gson = gsonBuilder.create(); 
System.out.println(gson.toJson(rock)); 

この印刷:GraphAdapterBuilderクラスはgson.jarに含まれていないあること

{ 
    '0x1': {'name': 'ROCK', 'beats': '0x2'}, 
    '0x2': {'name': 'SCISSORS', 'beats': '0x3'}, 
    '0x3': {'name': 'PAPER', 'beats': '0x1'} 
} 

注意。それを使用する場合は、手動でプロジェクトにコピーする必要があります。

+1

感謝を設定します!これは、休止状態を扱う際の救命救助者でした。 gsonを使用して、休止状態のエンティティを変換するとき、私には大変なトラブルがありました。 – Knubo

+0

もAndroidで動作します。 –

+3

jarにはこの "GraphAdapterBuilder"クラスが含まれていますか? – pavan

2

私はGsonについて知りませんが、私はJacksonと仕事をしています。 ObjectMapperクラスの使用例を見てください。再帰に関しては、@JsonManagedReferenceと@JsonBackReferenceを使って再帰を止めてください。それらの使用例も見てください。

1

@Expose(serialize = false)を使用すると、コレクションのシリアル化を回避できます。

0

使用過渡 @OneToManyを無視するgoogle.gsonため

関連する問題