À 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>
L'ajout de produit="application/json" pour votre @RequestMapping aider?
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 net have any Jackson beans , or any json mapping in the negotiating resolver , so if that doesnt aider , je net think its un double post
Mais vous ne Jackson dans le classpath?

OriginalL'auteur Adrian Bob | 2012-09-16