Spring JSON pose des problèmes lorsque le cadre Spring est mis à niveau de la version 3.0.2 à 3.2.0.

Je travaillais avec une application Web utilisant la version 3.0.2 du framework Spring et Hibernate (NetBeans 6.9.1). Plus tard, j’ai appris que l’un des bogues posait des problèmes lors du téléchargement de plusieurs fichiers, comme mentionné dans l’une des questions précédentes.

J’ai fini de me battre pour obtenir la solution mais je n’y suis pas parvenu. Par conséquent, j’ai mis à niveau la version Spring vers la version 3.2.0 .

Avec la version précédente (3.0.2), AJAX fonctionnait correctement avec Jackson 1.9.8 (sa page de téléchargement), mais avec la version ultérieure (3.2.0), tout fonctionnait bien, mais les appels AJAX signalaient une erreur partout dans le code JavaScript.

Il existe un scénario à un endroit où l’un des pays est sélectionné dans la zone de sélection de pays, la liste d’états correspondante est extraite du contrôleur Spring avec DAO. La méthode qui est mappée avec une URL dans le contrôleur Spring est la suivante,

@RequestMapping(value="ajax/GetStateList", method=RequestMethod.GET) public @ResponseBody List getStateSelectBox(HttpServletRequest request) { return cityService.getStateSelectBox(request.getParameter("countryId")); } 

Cette méthode est appelée lorsqu’un pays est sélectionné dans la zone de sélection de pays. La méthode getStateSelectBox() est définie dans l’une des classes DAO comme suit,

 @Service @Transactional(readOnly = true, propagation=Propagation.REQUIRES_NEW) public final class CityDAO implements CityService { private SessionFactory sessionFactory; public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } @SuppressWarnings("unchecked") public List getStateSelectBox(Ssortingng id) { List list = sessionFactory.getCurrentSession() .createQuery("select s.stateId, s.stateName from StateTable s where countryId.countryId=:id order by s.stateId") .setParameter("id", Long.parseLong(id)).list(); for(Object[]o:list) { System.out.println(o[0]+" : "+o[1]); } return list; } } 

La boucle foreach est juste pour des raisons de démonstration, elle affiche tous les états avec leur identifiant qui correspond à l’ countryId fourni par la requête AJAX mais la List n’est pas renvoyée à JSP.

Le code JavaScript utilisé pour envoyer cette demande AJAX signale une erreur. Il semble que le mappage JSON pose certains problèmes. La même chose fonctionnait avec la version précédente du framework Spring (3.0.2). Je ne sais pas pourquoi cela cause des problèmes avec la version plus récente de Spring, 3.2.0. Y at-il quelque chose avec la version Spring 3.2.0 qui me manque?


Si vous aviez besoin de voir le code JavaScript, le code JavaScript complet pour y parvenir serait le suivant.

 function getStates(countryId) { if(countryId==""||countryId==null||countryId==undefined||isNaN(countryId)) { var str="Select"; $('#stateList').html(str); alert("Please select an appropriate option."); return; } var div=document.createElement("div"); div.id="temp"; document.body.appendChild(div); $.ajax({ datatype:"json", type: "GET", contentType: "application/json", url: "/wagafashion/ajax/GetStateList.htm", data: "countryId=" + countryId+"&t="+new Date().getTime(), success: function(response) { if(typeof response==='object'&&response instanceof Array) { var str="Select"; var l=response.length; for(var i=0;i<l;i++) { str+=""+$('#temp').text(response[i][1]).html()+""; } str+=""; $('#stateList').html(str); // select box is written to #stateList div $('#temp').remove(); } }, error: function(e) { alert('Error: ' + e); } }); } 

Pour être sûr, la bibliothèque Jackson est sur le chemin de classe et je ne reçois aucune erreur ou exception du côté serveur. La requête AJAX aboutit et va au DAO via Spring et la liste de type List est extraite de la firebase database mais ce n’est pas une réponse de JSON à JSP (qui pourrait / devrait être mappée à un tableau JavaScript) . vraisemblablement, il semble qu’il manque quelque chose avec le mappage JSON, ce qui n’était toutefois pas le cas avec la version précédente de Spring.


MODIFIER:

J’ai essayé d’parsingr List dans les deux frameworks, 3.0.2 et 3.2.0 tels que

 List list = cityService.getStateSelectBox(request.getParameter("countryId")); ObjectMapper objectMapper=new ObjectMapper(); try { objectMapper.writeValue(new File("E:/Project/SpringHibernet/wagafashionLatest/temp.json"), list); } catch (IOException ex){} 

Le fichier temp.json contient la chaîne suivante.

 [[21,"Gujarat"],[22,"Maharashtra"],[23,"Kerala"],[24,"New Delhi"]] 

Dans les deux cas (avec les deux frameworks). Il semble donc que la réponse JSON devrait être la même dans les deux cas.

Le fichier temp.json peut également être désérialisé comme suit.

 try { ObjectMapper mapper=new ObjectMapper(); List list = mapper.readValue(new File("E:/Project/SpringHibernet/wagafashionLatest/temp.json"), new TypeReference<List>() {}); for(Object[]o:list) { System.out.println(o[0]+" : "+o[1]); } } catch (IOException ex) { } 

Cela fonctionne bien et la boucle foreach itère sur la List de types List . Le problème pourrait donc être causé par le cadre Spring lui-même. Quoi d’autre est nécessaire, je ne suis pas sûr. Pourquoi n’est-il pas cartographié par Jackson?

J’utilise Spring 3.1.3 et j’ai constaté que le mappage de Jackson tente de créer un object racine dans la réponse. Ceci est avec le mappeur Jackson2. Je n’ai pas essayé avec l’ancien mappeur de Jackson. Si vous avez également mis à niveau Jackson, vous rencontrerez peut-être le même problème.

Dans le passé, un tableau d’objects était mappé comme suit:

 [{name:'name1',id:4},{name:'name2',id:6}] 

Maintenant, je constate qu’ils fournissent un nom d’object généré automatiquement pour l’object.

 { objectArray: [{name:'name1',id:4},{name:'name2',id:6}]} 

Donc, vous devez référencer response.objectArray[0] au lieu de pouvoir référencer directement response[0]

Dans tous les cas, il est probable que la réponse JSON a quelque peu changé de format. Vous devriez regarder la nouvelle réponse et voir quels changements doivent être apportés dans le javascript pour que celui-ci mappe la nouvelle structure.

J’ai le même message sur le forum Spring. La solution des réponses à la question qui a finalement fonctionné pour moi était nécessaire pour configurer le fichier dispatcher-servlet.xml comme suit.

        atom=application/atom+xml html=text/html json=application/json *=*/*    

Cela a conduit JSON à travailler avec Jackson 1.9.8 et Spring 3.2.0 . Ceci est crédité à toutes les réponses à cette question.


Tout dispatcher-servlet.xml fichier dispatcher-servlet.xml ressemble maintenant à ce qui suit.

            atom=application/atom+xml html=text/html json=application/json *=*/*         indexController