I use the Gson library to convert Java objects to a Json response... the problem is that after a JPA requests the object retrieved from DB can not be converted because of a recursive relationship with other entities(see my previous question) for example :
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;
My source code:
EntityManagerFactory emf=Persistence.createEntityManagerFactory("JavaApplication21PU");
GpsJpaController gjc=new GpsJpaController(emf);
Gps gps=gjc.findGps("123456789012345");
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);
As you can see here i made :
for(int i=0;i<gps.getCoordonneesList().size();i++){
gps.getCoordonneesList().get(i).setGpsImei(null);
}
only to kill the recursive relationship by setting null for each GPS object in the coordonneesList..
In your opinion this is a good solution or is there another method more practical? Thanks
There's a Gson extension called GraphAdapterBuilder that can serialize objects that contain circular references. Here's a very simplified example from the corresponding test case:
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));
This prints:
{
'0x1': {'name': 'ROCK', 'beats': '0x2'},
'0x2': {'name': 'SCISSORS', 'beats': '0x3'},
'0x3': {'name': 'PAPER', 'beats': '0x1'}
}
Note that the GraphAdapterBuilder class is not included in gson.jar. If you want to use it, you'll have to copy it into your project manually.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With