在Spring中使用ResponseBody注释返回Json无法正常工作

时间:2012-09-16 17:23:47

标签: java jquery spring-mvc spring-annotations

我正在开发一个spring mvc web应用程序,我正在使用Google Visualization API生成一些图表。我有一个包含2个arraylists的模型类,它代表我发送到绘制图表的函数的数据(这是我想要转换为JSON的那个)。

模型类:

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

然后我ve got a @ Component`注释类,它包含一个返回模型对象(我上面写的类)的方法,并填充了2个arraylists属性。

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

所以Controller类,那个具有我正在调用的动作的映射来为图表生成收集数据的那个,我从上面的类中调用listPieChartData方法,其中我我还使用@ResponseBody注释:

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

绘制图表的JavaScript函数:

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

}

并且AJAX调用控制器的映射方法(用于收集数据),最终调用上面的JS函数来获取图表(我也发送请求param int id为控制器方法,我没有写过)

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

我知道这是很多代码:)但它的代码非常简单,为了更好地理解流程,以下是它的工作原理:

从一个按钮输入我用AJAX调用drawPieChart操作的映射方法(在ChartController类中),这个方法通过调用listPieChart方法发送响应(来自{{ 1}} class),返回一个ChartUtils对象(包含2个arraylists)。这个JsonResponse应该转换为JSON,因为在AJAX请求中,我告诉请求需要一个JSON输入(通过contentType:“application / json”),它应该得到它,因为我使用{在为此请求映射的控制器方法中为{1}}。

我得到了这样的答复:

  

此请求标识的资源只能生成   根据请求具有不可接受的特征的回复   “接受”标题()。
  (HTTP状态406)

请纠正我错在哪里,我无法解决这个问题,我无法弄明白为什么......

我的JsonResponse

@ResponseBody

2 个答案:

答案 0 :(得分:4)

所以问题是我没有在pom.xml中声明所有Jackson依赖项。 这些是您的maven项目的依赖项,以防您希望Spring 3使用@ResponseBody注释自动为您自动序列化对象,作为方法的响应。 Noob的东西,但我没有在我找到的例子中看到过这个。

  <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-jaxrs</artifactId>
        <version>1.6.1</version>
    </dependency>

        <dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-mapper-asl</artifactId>
    <version>1.9.9</version>
</dependency>

<dependency>
       <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-core-asl</artifactId>
    <version>1.9.9</version>
</dependency>

另外,我不得不在ajax调用中更改一些东西,用于调用返回json对象的方法以及图表生成的数据:

$("#buttonPieGenerate").live("click", function(){

    $.ajax({
        url: "drawPieChart", //method from controller
        contentType: "application/json",
        data: params,
        success: function(data) {

        drawPieChart(data.percentages, data.topics,'chart_div',600,400);
        }
    });

});

我正在访问Json对象中的数据,作为来自data.percentages,data.topics的调用的响应。

答案 1 :(得分:2)

2015年世界的小更新:

<dependency>
    <!-- Just placing this on the classpath will enable JSON for @ResponseBody -->
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.5.3</version>
</dependency>