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

Java EE Discussion :

@Produces JSON différent de EE 6 à EE 7


Sujet :

Java EE

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 138
    Points : 55
    Points
    55
    Par défaut @Produces JSON différent de EE 6 à EE 7
    Bonjour,

    J'ai récemment passé de java EE 6 à java EE 7 et de Glassfish 3 à Glassfish 4 (non sans difficulté mais c'est bon !)

    Mais il me reste un souci - non des moindres car je ne veux pas refaire mon code, il ne me produit plus la même chose quand j'appel ce webservice :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    @GET
    @Produces({"application/json", "application/xml"})
    public List<Pays> findAll() {
        return pays.getAllPays();
    }
    Mon serveur Glassfish 3 me donne ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {"pays":[{"exempleNPA":"9999","exempleTelephone":"+41 99 999 99 99","IDPays":"1","internationalPays":"CH","nomPays":"Suisse","regexNPA":"^[1-9][0-9]{3}$","regexTelephone":"^\\+41[ ][0-9]{2}[ ][0-9]{3}[ ][0-9]{2}[ ][0-9]{2}$"},{"exempleNPA":"xxxxx","exempleTelephone":"+33 9 99 99 99 99","IDPays":"2","internationalPays":"FR","nomPays":"France","regexNPA":"^(F-)?((2[A|B])|[0-9]{2})[0-9]{3}$","regexTelephone":"^\\+33[ ][1-6]{1}(([ ][0-9]{2}){4})$"},{"exempleNPA":"9999","exempleTelephone":"9999-9999999","IDPays":"3","internationalPays":"AT","nomPays":"Autriche","regexNPA":"^[0-9]{4,4}$","regexTelephone":"^[+0-9 ]+$"},{"exempleNPA":"a1a 1a1","exempleTelephone":"(999) 999-9999","IDPays":"4","internationalPays":"CA","nomPays":"Canada","regexNPA":"^[A-Z]{1}[0-9]{1}[A-Z]{1}[ ][0-9]{1}[A-Z]{1}[0-9]{1}$","regexTelephone":"^[(][0-9]{3}[)][ ][0-9]{3}[-][0-9]{4}$"}]}
    Et mon serveur Glassfish 4 me donne ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [{"IDPays":1,"exempleNPA":"9999","exempleTelephone":"+41 99 999 99 99","internationalPays":"CH","nomPays":"Suisse","regexNPA":"^[1-9][0-9]{3}$","regexTelephone":"^\\+41[ ][0-9]{2}[ ][0-9]{3}[ ][0-9]{2}[ ][0-9]{2}$"},{"IDPays":2,"exempleNPA":"xxxxx","exempleTelephone":"+33 9 99 99 99 99","internationalPays":"FR","nomPays":"France","regexNPA":"^(F-)?((2[A|B])|[0-9]{2})[0-9]{3}$","regexTelephone":"^\\+33[ ][1-6]{1}(([ ][0-9]{2}){4})$"},{"IDPays":3,"exempleNPA":"9999","exempleTelephone":"9999-9999999","internationalPays":"AT","nomPays":"Autriche","regexNPA":"^[0-9]{4,4}$","regexTelephone":"^[+0-9 ]+$"},{"IDPays":4,"exempleNPA":"a1a 1a1","exempleTelephone":"(999) 999-9999","internationalPays":"CA","nomPays":"Canada","regexNPA":"^[A-Z]{1}[0-9]{1}[A-Z]{1}[ ][0-9]{1}[A-Z]{1}[0-9]{1}$","regexTelephone":"^[(][0-9]{3}[)][ ][0-9]{3}[-][0-9]{4}$"}]
    La différence se situe surtout dans le faite que dans mon nouveau serveur, la clé de mon tableau n'est plus le nom de ma classe ! Ce qui me perturbe énormément dans mon code comme vous pouvez vous en doutez ... Et le faite que c'était trié par ordre alphabétique, j'aimais bien aussi....

    Comment remettre ma classe comme clé de la valeur ?

    Merci énormément de votre aide

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 138
    Points : 55
    Points
    55
    Par défaut
    Il semblerait que c'est parce que je n'utilise pas Jersey comme provider pour JSON... Quelqu'un sait comment l'implémenter sans MAVEN ? Car mon projet n'est pas sur maven..

    Merci

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 138
    Points : 55
    Points
    55
    Par défaut
    J'en ai vu plusieurs qui cherche à faire le contraire et en Glassfish v3, mais personne veut le faire en Glassfish v4 qui ne le fait pas par défaut... Connaissez-vous un moyen de le faire ?

    Voici un lien qui en parle : http://stackoverflow.com/questions/4...hout-root-node

    Je précise que cela marche super bien en XML... C'est vraiment la partie JSON qui ne me sort pas comme je veux :-(

    J'ai également ce lien qui fait ce que je veux : http://stackoverflow.com/questions/1...hout-root-node

    Mais il ne le fait pas automatiquement.. et je sais qu'il existe un moyen de le faire automatiquement vu que je l'avais avec Glassfish v3

  4. #4
    Membre confirmé
    Avatar de provirus
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2009
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2009
    Messages : 248
    Points : 580
    Points
    580
    Par défaut
    Citation Envoyé par chatis Voir le message
    J'en ai vu plusieurs qui chercher à faire le contraire et en Glassfish v3, mais personne veut le faire en Glassfish v4 qui ne le fait pas par défaut...
    Je dois dire que je ferais parti de ceux-là

    Selon le output de v3 que tu nous montres, le en JSON est plutôt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Map<String, List> result = new HashMap<>();
    result.put("pays", pays);
    Ce qui n'est pas du tout la même chose. La sortie de v4 est vraiment une liste de pays.

    Malheureusement, je ne sais pas comment changer de l'un a l'autre. Tu pourrais toujours changer ton résultat pour être une Map au lieu d'une liste puisque c'est ce que tu désires vraiment retourner.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 138
    Points : 55
    Points
    55
    Par défaut
    Merci mais non ce n'est pas ca que je veux... et ca ne marche pas non plus :-(

    Je sais qu'il y a un moyen de le faire automatiquement et sans changer le code en passant par jettison ou jackson ou quelque chose comme ça, mais je ne sais pas le quel et comment le faire...

    Je ne peux pas laisser mon code comme ça car il ne sera plus compatible avec mon application iPhone/Androïd...

    C'est quelque chose comme "add root-node to your json output" mais je ne trouve rien là-dessus :-(

    Merci de ton aide

  6. #6
    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,

    Citation Envoyé par chatis Voir le message
    La différence se situe surtout dans le faite que dans mon nouveau serveur, la clé de mon tableau n'est plus le nom de ma classe ! Ce qui me perturbe énormément dans mon code comme vous pouvez vous en doutez ...
    C'est un peu embêtant mais (sans savoir ce que ton application devrait faire), qu'est-ce qu'il y a d'insurmontable ? Retrouver le nom d'un objet par son id n'est pas si impossible que ça.
    Ou alors ça pose problème lors de la desérialisation de la liste ?

    Citation Envoyé par chatis Voir le message
    Et le faite que c'était trié par ordre alphabétique, j'aimais bien aussi....
    Ça c'est très simple, dans ta classe AbstractFacade.java (ou enfin, la superclasse de la classe qui te fournit la méthode getAllPays()) tu peux avoir une méthode qui trie par ordre ascendant tout objet possédant un attribut "nom", vu que les autres classes *Facade (y compris les *FacadeREST) héritent d'AbstractFacade :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        public List<T> findAllByNameAsc() {
            javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
            Root<T> root = cq.from(entityClass);
            cq.select(root);
            cq.orderBy(getEntityManager().getCriteriaBuilder().asc(root.get("nom".trim())));
            return getEntityManager().createQuery(cq).getResultList();
        }
    Ensuite, tu n'as qu'à appeler cette méthode à la place de getAllPays().

    Citation Envoyé par chatis Voir le message
    Comment remettre ma classe comme clé de la valeur ?
    J'ai trouvé cet exemple un peu au hasard, tu pourrais essayer vu qu’apparemment ton objet Pays est assez simple (pour des classes ayant des dépendances d'objets : il ne faut pas rêver !). Mais cela implique toujours que tu devrais modifier ton code...

    Cela me surprend un peu "que cela marche super bien en XML", là aussi tu as dû appliquer une "enveloppe" de liste comme expliqué par Lars Vogel. Alors, si je serais à ta place, je prendrais la solution qui ne le fait pas automatiquement.. En fin de compte, tu ne peux pas savoir si c'est la version de GlassFish ou les specs de Java 7 qui ne permettent plus que tu obtiennes le même résultat.
    Chaque fois que tu dis "je ne peux pas", n'oublie pas d'ajouter le mot "encore".

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 138
    Points : 55
    Points
    55
    Par défaut
    Merci de ton aide Mishulyna,

    J'en ai parlé du lien de la façon manuel aussi, mais c'était beaucoup trop compliqué à mettre en place dans mon projet qui comprend plus de 100 entitées..

    Mais oui promis en XML ca sort exactement comme j'ai besoin et trié ! C'est fou !!! et en JSON c'est plus capricieux, des fois c'est trié, des fois non... je ne comprends pas... et des fois c'est trié, mais l'ID reste au sommet

    Mais j'ai finalement abandonné l'idée et j'ai respecté les nouvelles normes.... Mais pour info, ca fait 3 jours à minimum 10h/j que je passe sur mon projet afin de le remettre à jour pour JEE 7 et Glasssfish 4 ! Car il n'y avait pas que ca qui changeait, il y avait également le type Bool qui est pris en compte maintenant en JSON et le format date et heure ne peut plus être réduit, il faut absolument que la variable soit complète ('2014-12-31' n'est plus valable, il faut '2014-12-31T00:00:00+00:00' tant pour l'heure que pour la date quand bien même on a l'annotation @Temporal.

    Aussi, il ne retourne plus de NULL s'il ne trouve pas l'entitée, mais une entitée vide ! Enfin c'est pleins de chose sur mon projet que j'ai dû repasser page par page afin de tout remettre à jour....

    Merci encore

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Jackson [JSON to Java]: attribut du json différent de l'attribut du bean
    Par Casshern dans le forum Format d'échange (XML, JSON...)
    Réponses: 0
    Dernier message: 02/11/2012, 16h38
  2. mouse.cursorpos.y différent de ce que j'attends
    Par Guigui_ dans le forum Composants VCL
    Réponses: 3
    Dernier message: 28/11/2002, 21h52
  3. Récupérer 10 nb différents avec un calcul aléatoire
    Par BXDSPORT dans le forum Langage
    Réponses: 3
    Dernier message: 04/08/2002, 02h35
  4. Simulation de transmission de paquet entre différent réseaux
    Par MelloW dans le forum Développement
    Réponses: 2
    Dernier message: 12/07/2002, 19h51
  5. Réponses: 2
    Dernier message: 17/05/2002, 20h37

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