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>
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 doesn
t Hilfe , ich weißt think it
s ein doppelter postAber Sie do haben Jackson im classpath?
InformationsquelleAutor Adrian Bob | 2012-09-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Also das problem war, dass ich mich hätte allen Jackson Abhängigkeiten deklariert pom.xml.
Diese sind die Abhängigkeiten für Ihre maven-Projekt ist, sollten Sie die Feder 3 automatisch serialisiert ein Objekt für Sie , mit dem @ResponseBody annotation , als Antwort auf eine Methode.
Noob Zeug , aber ich habe nicht gesehen das erwähnt in den Beispielen, die ich gefunden habe .
Außerdem hatte ich einige Sachen in der ajax-Aufruf für den Aufruf der Methode, die Rücksendung der json-Objekt mit Daten für das Diagramm Erzeugung :
Ich bin Zugriff auf die Daten in der Json-Objekt, dass ich immer als Antwort auf den Aufruf mit Daten.Prozentsätze , Daten.Themen .
InformationsquelleAutor Adrian Bob
Ein kleines update für die Welt 2015:
InformationsquelleAutor Michael Piefel