IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Services Web Java Discussion :

Jersey et fichier JSON : multiplication d'objets


Sujet :

Services Web Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10
    Points : 11
    Points
    11
    Par défaut Jersey et fichier JSON : multiplication d'objets
    Bonjour,

    J'ai un souci avec jersey.
    Ma méthode lui envoie une liste d'object.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    @Path("/get")
    public class Ressource {
     
        @GET
        @Path("/projects")
        @Produces("application/json")
        public List<Project> getProjects() {
            List<Project> list = DaoFactory.getProjectDao().listProjectsInProgress();
            return list;
     
        }
    }
    J'ai fait un test avec une liste ne comportant qu'un seul objet et il me r'envoie un fichier json avec plusieurs fois le même objet.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    [{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":[{"id":45,"title":"gd","description":"fdgfgd","dateStart":1387407600000,"dateEnd":1388358000000,"goal":2006,"category":{"id":10,"name":"Defaut","projects":
    etc...

    C'est quoi le problème ?

  2. #2
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    On peut voir le contenu de la classe project?

    A priori, je dirais une référence cyclique, mais je peux me tromper...
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10
    Points : 11
    Points
    11
    Par défaut
    Voici mon objet project :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    @Entity
    public class Project implements Serializable {
     
        private static final long serialVersionUID = 1L;
        @Id
        @GeneratedValue
        private long id;
     
        private String title;
        private String description;
        @Temporal(javax.persistence.TemporalType.DATE)
        private Date dateStart;
        @Temporal(javax.persistence.TemporalType.DATE)
        private Date dateEnd;
        private int goal;
     
        private boolean Expired;
        private boolean Complete;
     
        @ManyToOne
        @JoinColumn(name = "category_fk")
        private Category category;
     
        @ManyToOne
        @JoinColumn(name = "user_fk")
        private User user;
     
        @OneToMany(mappedBy = "project")
        private List<Donation> donations = new ArrayList<Donation>();
    Quand j'appel ma méthode qui la charge de ma base tout va bien je n'ai qu'un seul objet.
    Mais ça ne fonctionne pas avec le json.

  4. #4
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    C'est bien un problème de référence cyclique...

    Dans la classe project, tu as une référence vers une catégorie qui contient elle-même une liste de projets. Quand le sérialiseur json passe en revue les propriétés, et comme tu ne lui as donné aucune instruction, il tombe dans une espèce de boucle sans fin de sérialisation (je sérialise un projet -> une catégorie -> qui contient une liste de projet -> je sérialise la liste de projets -> le premier contient une catégorie -> qui contient une liste de projets -> le premier projet contient une catégorie -> ..........)

    Plusieurs solutions, plus ou moins couteuses:

    1) le plus simple, mais pas le mieux: mettre un javax.xml.bind.annotation.XmlTransient sur la propriété "private Category category;", ce qui va la supprimer du flux json et du coup, éviter les références cycliques
    2) (mieux) créer une classe dédiée pour représenter le flux json correctement, puis faire un mapping d'une forme à l'autre (peut-être via un outil comme dozer). ça pourrait ressembler à ça:
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    @XmlRootElement
    @JsonIgnoreProperties(ignoreUnknown = true)
    public class ProjectJson {
     
    @XmlElement(name = "id")
        private long id;
     
    @XmlElement(name = "title")
        private String title;
     
    @XmlElement(name = "desc")
        private String description;
     
    @XmlElement(name = "dateStart")
        private Date dateStart;
     
    @XmlElement(name = "dateEnd")
        private Date dateEnd;
     
    @XmlElement(name = "expired")
        private boolean Expired;
     
    @XmlElement(name = "complete")
        private boolean Complete;
     
    @XmlElement(name = "categoryName")
        private String category;
    ...
    }
    C'est mieux bien qu'un peu plus complexe. De toute façon, la solution d'exposer les entités de base de données directement en json (comme tu l'as fait) est assez mauvaise (aucun contrôle sur ce qui sort et service web très dépendant de la représentation en DB). Une couche de transformation se justifie dans ces cas-là.

    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  5. #5
    Traductrice
    Avatar de Mishulyna
    Femme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2008
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 504
    Points : 7 840
    Points
    7 840
    Par défaut
    Bonjour,

    Pourriez-vous montrer le code du test?

    Dans certains cas de figure il pourrait être utile d'annoter les getters susceptibles à générer des références cycliques (ceux qui ramènent des listes d'objets) tant par @XmlTransient que par @JsonIgnore.
    Chaque fois que tu dis "je ne peux pas", n'oublie pas d'ajouter le mot "encore".

Discussions similaires

  1. [XCode] Récupérer un fichier JSON formé d'un objet
    Par searchsport dans le forum XCode
    Réponses: 0
    Dernier message: 22/08/2013, 19h43
  2. [VBA-E] Import de fichier txt multiple
    Par Jidewe dans le forum Macros et VBA Excel
    Réponses: 19
    Dernier message: 13/02/2007, 10h45
  3. [AJAX] Récupération d'un fichier JSON avec javaScript
    Par guerin dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 26/11/2006, 19h05
  4. Réponses: 8
    Dernier message: 19/09/2006, 15h42
  5. [Upload] upload fichiers avec multiple submit
    Par dolf13 dans le forum Langage
    Réponses: 17
    Dernier message: 06/06/2006, 01h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo