À l'aide de ResponseBody annotation au Printemps pour le retour Json ne fonctionne pas
Je suis en train de travailler sur un spring mvc de l'application web, dans lequel je suis en utilisant Google Visualisation de l'API pour générer des graphiques. J'ai une classe de modèle qui contient 2 arraylists, qui représentent les données que j'envoie à la fonction qui dessine le graphique (c'est ce que je veux être converti au format JSON).
La classe du modèle:
@Component
public class JsonResponse {
private List<Integer> percentages = new ArrayList<Integer>();
private List<String> topics = new ArrayList<String>();
public JsonResponse(){
}
public List<Integer> getPercentages() {
return percentages;
}
public void setPercentages(List<Integer> percentages) {
this.percentages = percentages;
}
public List<String> getTopics() {
return topics;
}
public void setTopics(List<String> topics) {
this.topics = topics;
}
}
Puis jeve got a
@Component` annoté de la classe qui contient une méthode qui renvoie un objet de modèle (de la classe que j'ai écrit ci-dessus), avec les 2 arraylists attributs peuplée.
@Component
public class ChartUtils {
@Autowired
public JsonResponse response;
public JsonResponse listPieChartData( ModelAndView model ,int waveId ){
//arraylists for chart generation
List<Integer> percentages = new ArrayList<Integer>();
List<String> topics = new ArrayList<String>();
{... code for accessing the DB and processing some data and then populating the 2
arraylists ... }
response.setTopics(topics);
response.setPercentages(percentages);
return response;}
}
De sorte que le Contrôleur de la classe, celui qui a la cartographie de l'action que je fais appel à recueillir des données pour la génération de graphique et dans laquelle je fais appel listPieChartData
méthode, à partir de la classe ci-dessus, et dans lequel je suis également à l'aide de la @ResponseBody
annotation est-ce:
@Controller
public class ChartController {
@Autowired
public ChartUtils utils;
@Autowired
public JsonResponse response;
@RequestMapping(value = "/drawPieChart", method = RequestMethod.GET )
@ResponseBody
public JsonResponse drawPieChart( ModelAndView model,
@RequestParam(value = "id", defaultValue = "-1") int waveId ) {
return utils.listPieChartData(model,waveId ); }
La fonction JavaScript qui tire la carte :
function drawColumnChart(percentages, topics , div,width,height) {
var data = new google.visualization.DataTable();
data.addColumn('string', 'Wave');
for (var i=0; i < topics.length; i++){
data.addColumn( 'number', topics[i] );
}
data.addRow( percentages );
var wave=percentages[0];
var options = {
'title':'Generated Chart For '+wave,
'backgroundColor': { fill: "none" },
'is3D': true,
'width':width,
'height':height,
};
var chart = new google.visualization.ColumnChart(document.getElementById(div));
chart.draw(data, options);
}
Et de l'appel AJAX pour le contrôleur de la méthode mappée (pour la collecte de données) qui appelle enfin au-dessus de la JS fonction pour obtenir le graphique (je suis aussi de l'envoi de la demande de param int id du contrôleur de méthode , je n'ai pas écrit que)
$("#button").live("click", function(){
var arrayP, arrayT;
$.ajax({
url: "drawPieChart",
contentType: "application/json",
data: params,
success: function(data) {
$.each(data, function(messageIndex, message) {
if (messageIndex === 0) {
arrayP = message;
} else {
arrayT = message;
}
});
drawPieChart(arrayP, arrayT,'chart_div',600,400);
}
});
});
Je sais que c'est beaucoup de code 🙂 mais c'est assez simple code, de comprendre les flux mieux, voici comment cela fonctionne:
À partir d'un bouton d'entrée je vais appeler, avec l'AJAX, la méthode mappée à la drawPieChart l'action (qui est dans le ChartController
classe), cette méthode envoie la réponse par le biais de l'invocation de la listPieChart méthode (de l' ChartUtils
classe), qui renvoie un JsonResponse
objet, (qui contient 2 arraylists). Cette JsonResponse
doit être converti au format JSON, parce que, dans la requête AJAX, j'indique que la demande a besoin d'un JSON d'entrée (via contentType: "application/json"), et il doit le faire parce que je utiliser @ResponseBody
méthode du contrôleur mappés pour cette demande.
Je reçois cette réponse:
La ressource identifiée par cette demande n'est capable de générer
les réponses avec des caractéristiques pas acceptable en fonction de la demande
"accepter" en-têtes (headers).
(D'État HTTP 406)
S'il vous plaît corrigez-moi où je me trompe, je ne peux pas obtenir ce travail et je ne peux pas comprendre pourquoi...
Et mon servlet-context.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- DispatcherServlet Context: defines this servlet's request-processing
infrastructure -->
<!-- Enables the Spring MVC @Controller programming model -->
<annotation-driven />
<!-- Handles HTTP GET requests for /resources/** by efficiently serving up
static resources in the ${webappRoot}/resources directory -->
<resources mapping="/resources/**" location="/resources/" />
<!-- Resolves views selected for rendering by @Controllers to .jsp resources
in the /WEB-INF/views directory -->
<beans:bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
<context:component-scan base-package="com.bla.bla" />
<beans:import resource="classpath:springJDBC.xml" />
</beans:beans>
Hy , je l'ai essayé , et j'obtiens le même résultat , j'ai aussi utilisé firebug pour inspecter la demande , et l'en-tête contient le Type de Contenu application/json , donc je ne sais vraiment pas quel est le problème...
Double de stackoverflow.com/questions/3340050/...?
Après avoir regardé la réponse à ce post , je ne
t have any Jackson beans , or any json mapping in the negotiating resolver , so if that doesn
t aider , je net think it
s un double postMais vous ne Jackson dans le classpath?
OriginalL'auteur Adrian Bob | 2012-09-16
Vous devez vous connecter pour publier un commentaire.
Donc, le problème était que je n'aurais tous les Jackson dépendances déclarées dans pom.xml.
Ce sont les dépendances de votre projet maven dans le cas où vous souhaitez le Printemps 3 automatiquement sérialiser un objet pour vous , en utilisant le @ResponseBody annotation , comme une réponse à partir d'une méthode.
Noob trucs , mais je n'avais pas vu cette mentionnées dans les exemples que j'ai trouvé .
Aussi , j'ai dû changer quelques trucs dans l'appel ajax pour l'invocation de la méthode qui retourne l'objet json avec les données pour la génération de graphique :
Je suis accéder à des données dans l'objet Json que j'obtiens comme réponse à partir de l'appel avec les données.les pourcentages , les données.sujets .
OriginalL'auteur Adrian Bob
Une petite mise à jour pour le monde de 2015:
OriginalL'auteur Michael Piefel