Mit ResponseBody annotation im Frühjahr für die Rückgabe eines Json funktioniert nicht

Arbeite ich an einem spring mvc web-Anwendung, in der ich mich mit Google Visualization API für die Erzeugung von einigen Diagrammen. Ich habe eine Modell-Klasse, die enthält 2 arraylists, die die Daten darstellen, die ich sende, um die Funktion, das zeichnet das Diagramm (dies ist, was ich will umgewandelt werden in ein JSON).

Die model-Klasse:

@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;
}
}

Dann habe ichve got a@Komponente` annotierten Klasse enthält eine Methode, die zurückgibt, ein model-Objekt (der Klasse, in der ich oben schrieb), mit dem 2 arraylists Attributen.

@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;}
}

Also die Controller-Klasse, die das mapping für die Aktion, ich bin Aufruf zum sammeln von Daten für die Diagramm-Erzeugung und in die ich rufe listPieChartData Methode aus der Klasse oben, und in dem bin ich auch mit der @ResponseBody Anmerkung ist diese:

@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 ); }

Die JavaScript-Funktion, zeichnet das Diagramm :

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);

}

Und der AJAX-Aufruf an den controller abgebildet-Methode (sammeln von Daten), die abschließend fordert, die über JS-Funktion zum abrufen der chart (ich bin auch senden der request-param int id für die controller-Methode , die ich nicht schrieb, dass)

$("#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);
    }
    });  
});

Ich weiß, das ist viel code 🙂 aber es ist ziemlich einfach, code zu verstehen, der flow besser ist, hier ist, wie es funktioniert:

Vom ein-Taster-Eingang bin ich aufrufen, mit AJAX, das mapped-Methode, um die drawPieChart Aktion (die sich in der ChartController Klasse), dieses Verfahren sendet die Antwort durch Aufruf der listPieChart Methode (von der ChartUtils Klasse), das gibt einen JsonResponse - Objekt (enthält 2 arraylists). Diese JsonResponse sollten umgewandelt werden in ein JSON -, weil in der AJAX-Anfrage ist, sage ich, dass die Anfrage muss ein JSON-Eingang (via contentType: "application/json"), und er sollte es bekommen, weil ich @ResponseBody in der controller-Methode zugeordnet, die für diesen Antrag.

Bin ich immer diese Antwort:

Die Ressource identifiziert, die durch diese Anforderung ist nur in der Lage zu generieren
Antworten mit Merkmalen, die nicht akzeptabel ist nach der Anfrage
"accept" - Header ().

(HTTP-Statuscode 406)

Bitte korrigiert mich wo ich falsch Liege, ich kann einfach nicht damit es funktioniert, und ich kann nicht herausfinden, warum...

Und meine 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>
Wirkt sich das hinzufügen erzeugt="application/json", um Ihre @RequestMapping helfen?
Hy , ich habe es versucht und ich bekomme das gleiche Ergebnis , ich habe auch firebug überprüfen, die Anforderung , und der header enthält Content-Type application/json , also ich weiß wirklich nicht, was das problem ist...
Duplikat von stackoverflow.com/questions/3340050/...?
Nach einem Blick auf die Antwort für diesen post , ich weißt have any Jackson beans , or any json mapping in the negotiating resolver , so if that doesnt Hilfe , ich weißt think its ein doppelter post
Aber Sie do haben Jackson im classpath?

InformationsquelleAutor Adrian Bob | 2012-09-16

Schreibe einen Kommentar