Bonjour,
J'ai une petite architecture dans laquelle j'ai quelques POJO annotés avec JPA et qui sont sauvegardés dans ma base de données. Dans ces POJOs j'ai des relation OneToMany.
Je cherche à faire un service qui récupère mes entities et qui les retourne en JSON.
J'utilise l'implémentation jersey pour JAX-RS.
Mon problème est que lorsque j'essaye de sérializer mon POJO, j'obtiens une exception "Mapping cyclic references to XML". POJO1 => List<POJO2> => POJO1
En regardant un peu sur Internet j'ai vu que l'on pouvait fixer ce problème via les annotations @XmlId et @XmlIdRef (de manière à référencer POJO2 par exemple plutot que de le sérializer à chaque fois). Le problème est que l'annotation @XmlId ne peut être définie que sur une clé de type java.lang.String. Problème ma clé primaire est une clé de type java.lang.Long.
Donc ma question est, est ce qu'il existe un moyen de mettre cette annotation sur un Long, ou bien est ce qu'il existe une au méthode me permettrai de sérializer mon POJO, sans faire toute la sérialization à la main.
Merci.
PS: Un petit bout de code pour voir le problème
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 @XmlRootElement(name="demo1") @NamedQuery(name="Demo.all", query="SELECT d FROM Demo1 d") @Entity public class Demo1 { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private Long id; @ManyToOne @JoinColumn(name = "demo_id") private Demo2 demo; private String name; //getters & setters }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 @XmlRootElement(name = "demo2") @Entity public class Demo2 { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @OneToMany(mappedBy = "demo") private List<Demo1> demo1List; private String name; //getters & setters }Je pense qu'il doit exister une solution toute simple car je ne doit pas être le premier à vouloir sérializer un POJO JPA, mais je ne l'ai pas encore trouvée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 @Path("/demo") public class DemoResources { private EntityManagerFactory emf; private EntityManager em; public DemoResources() { emf = Persistence.createEntityManagerFactory("androidJTA"); em = emf.createEntityManager(); } @GET @Produces("application/json") public List<Demo1> getDemo() { Query query = em.createNamedQuery("Demo.all"); return query.getResultList(); } }
Partager