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

Spring Java Discussion :

[Ajax] Retourner un objet en Json ?


Sujet :

Spring Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2013
    Messages : 90
    Par défaut [Ajax] Retourner un objet en Json ?
    Bonjour à tous,

    Je viens vers vous pour une petite question. Avec Spring je fais actuellement des requêtes Ajax pour aller récupéré des élements dans une base de donnée avec Hibernate. Jusque ici je n'ai eu aucuns soucis comme je renvoyait des chaines de caractères simple à ma requête Ajax c'était pas un soucis avec Json.

    Seulement voilà, maintenant il me faut retourner des objets et là ça coince, Json n'est pas trop d'accord avec ça ^^' En farfouillant sur le net j'ai vu qu'il "suffisait" d'implémenter mes classes avec Serializable pour que cela fonctionne, malheureusement ça ne fonctionne pas :/

    D'où ma question, est-ce que en plus de cette implémentation de la classe à renvoyer et de l'annotation @ResponseBody à ma méthode qui gère ma requête Ajax je dois spécifier quelque chose d'autre ?

    Sachant que pour l'instant je procède ainsi :
    - Ma méthode qui récupère ma requête Ajax côté Java (et le tout fonctionne bien, avec le Sysout que j'effectue dans le code Java, j'ai bien récupéré les éléments dont j'ai besoin)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @RequestMapping(value="/attributes", method=RequestMethod.GET)
    		@ResponseBody
    		public List<MetaAttribute> loadAttribute(@RequestParam("id") long id){
    			List<MetaAttribute> listAttributes = convertMetaAttributeCollectionToMetaAttributeList(metaAttributeService.getAllAttributesFromOneClass(id));
     
    			for (MetaAttribute myClass : listAttributes) {
    				System.out.println(myClass.getName());
    			}
     
    			return listAttributes;
    		}
    Début de ma classe correspondante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class MetaAttribute implements Serializable
    Merci d'avance

  2. #2
    Membre Expert Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Par défaut
    salut
    essaies de creer une classe du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public class MetaAttributeList extends ArrayList<MetaAttribute> {
    }
    et tu changes comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    @RequestMapping(value="/attributes", method=RequestMethod.GET)
    		@ResponseBody
    		public MetaAttributeList loadAttribute(@RequestParam("id") long id){
    			MetaAttributeList listAttributes = new MetaAttributeList();
    List<MetaAttribute> liste = convertMetaAttributeCollectionToMetaAttributeList(metaAttributeService.getAllAttributesFromOneClass(id));
     listAttributes.setListe(liste);
    			for (MetaAttribute myClass : liste) {
    				System.out.println(myClass.getName());
    			}
     
    			return listAttributes;
    		}
    cela devrait resourdre le probleme.

    Eric

  3. #3
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2013
    Messages : 90
    Par défaut
    Il n'y a pas une solution sans devoir passer par une classe supplémentaire ? Cette solution m'ennuie un peu je dois dire ^^'

    J'ai vu qu'il y avait gson de Google qui permettait de faire la conversion json -> java et java -> json, il existe la même chose pour jackson ? Les seuls trucs du genre que j'ai vu sur le net c'est de construire la réponse json soit même, je trouve ça un peu lourd et contraignant si on a beaucoup de données à devoir retourner :/

  4. #4
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2013
    Messages : 90
    Par défaut
    Vraiment personne ?

    J'en ai marre de cetet foutue erreur 500 à la con... En farfouillant dans les recoins de Google je suis tombé sur ça : http://blogershub.com/Archive/2013/1...l-server-error

    Mais je ne sais pas où le mettre, dans mon dispatcher ou mon web il n'accepte pas :/

  5. #5
    Membre Expert Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Par défaut
    salut
    as tu essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @RequestMapping(value="/attributes", method=RequestMethod.GET)
    		@ResponseBody
    		public ResponseEntity<List<JsonAssessment>> loadAttribute(@RequestParam("id") long id){
    			List<MetaAttribute> listAttributes = convertMetaAttributeCollectionToMetaAttributeList(metaAttributeService.getAllAttributesFromOneClass(id));
     
    			for (MetaAttribute myClass : listAttributes) {
    				System.out.println(myClass.getName());
    			}
     
    			return new ResponseEntity(listAttributes);
    		}
    Eric

  6. #6
    Membre chevronné Avatar de ruscov
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mars 2007
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mars 2007
    Messages : 347
    Par défaut
    Pour ton JSON ajx, normalement, en ajoutant la dépendance :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <!-- Jackson JSON Mapper -->
    		<dependency>
    			<groupId>org.codehaus.jackson</groupId>
    			<artifactId>jackson-mapper-asl</artifactId>
    			<version>${jackson.version}</version>
    		</dependency>
    cela devrait fonctionner. ${jackson.version} à remplacer avc la version que tu veux utiliser (en génral la dernière). Voir http://mvnrepository.com/ pour la liste officielle.

  7. #7
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2013
    Messages : 90
    Par défaut
    Après avoir fouiller sur le net et créer un fichier de debug pour log4j grâce à un tuto (log4j.properties à mettre dans les ressources), j'ai découvert ces erreurs à la création de ma réponse Json :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: failed to lazily initialize a collection of role
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    could not initialize proxy - no Session
    J'en déduis donc que j'essaye d'accéder à des éléments de la base de donnée après avoir fermé la session Hibernate, d'où l'erreur 500, je n'ai donc qu'à modifier mes Dao en conséquence.

    J'ai vu juste ?
    Je reviens par ici pour confirmer/infirmer mon idée, auquel cas si c'est pas ça je posterai le pom et compagnie (histoire de pas embêter le monde pour rien avec ça si je résoud mon problème avec les Dao)

  8. #8
    Membre chevronné Avatar de ruscov
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mars 2007
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mars 2007
    Messages : 347
    Par défaut
    effectivement. Mais tu ne dois pas spécialement modifier tes DAO.
    Tu peux rajouter dans ton web.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <filter>
    		<filter-name>openEntityManagerInViewFilter</filter-name>
    		<filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
    		<init-param>
    			<param-name>entityManagerFactoryBeanName</param-name>
    			<param-value>entityManagerFactory</param-value>
    		</init-param>
    	</filter>
    	<filter-mapping>
    		<filter-name>openEntityManagerInViewFilter</filter-name>
    		<url-pattern>/*</url-pattern>
    	</filter-mapping>
    entityManagerFactory = le nom du bean dans ta config spring pour l'accès à la DB.

    Cela te permet de garder ta session Hibernate ouverte jusque dans la vue le temps de ta request.

  9. #9
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2013
    Messages : 90
    Par défaut
    J'ai préféré aller modifier directement ma requête comme j'avais remarquer que ce qu'il essayer d'aller chercher, et qui causais le bug, étaient des éléments dont je n'avais pas besoin pour cet affichage, ainsi çe me fait moins d'élements à retourner ^^

    Mais je garde cette deuxième solution quand même au cas ou pour plus tard, merci !

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

Discussions similaires

  1. Application pour retourner un objet JSON
    Par fujitsu4 dans le forum Format d'échange (XML, JSON...)
    Réponses: 0
    Dernier message: 22/11/2014, 17h38
  2. [2.x] Ajax : Retourner un render de template en json
    Par noname2 dans le forum Symfony
    Réponses: 4
    Dernier message: 13/10/2014, 09h43
  3. Retourner un tableau d'objet avec json vers javascript
    Par beegees dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 09/04/2013, 20h20
  4. Retourner un objet json depuis un $.get
    Par falatop dans le forum jQuery
    Réponses: 1
    Dernier message: 16/08/2010, 17h45
  5. Problème Corba retourner un objet
    Par stephane92400 dans le forum Général Java
    Réponses: 17
    Dernier message: 07/06/2006, 09h37

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