java - 在 Spring 中使用 ResponseBody 注释返回一个不工作的 Json

标签 java jquery spring-mvc spring-annotations

我正在开发一个 spring mvc web 应用程序,我在其中使用 Google Visualization API 生成一些图表。我有一个包含 2 个数组列表的模型类,它们代表我发送到绘制图表的函数的数据(这是我想要转换为 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;
}
}

然后我得到一个@Component 注释类,它包含一个返回模型对象(我上面写的类的)的方法,并填充了 2 个数组列表属性。

@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 调用 Controller 的映射方法(用于收集数据),最终调用上述 JS 函数来获取图表(我还为 Controller 方法发送了请求参数 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 方法(来自ChartUtils 类),它返回一个 JsonResponse 对象(包含 2 个数组列表)。此 JsonResponse 应转换为 JSON,因为在 AJAX 请求中,我告诉该请求需要 JSON 输入(通过 contentType:“application/json”),它应该得到它,因为我在为此请求映射的 Controller 方法中使用了 @ResponseBody

我收到这样的回复:

The resource identified by this request is only capable of generating responses with characteristics not acceptable according to the request "accept" headers ().
(HTTP Status 406)

请纠正我错误的地方,我就是无法正常工作,我也不知道为什么...

还有我的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>

最佳答案

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

  <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 调用的响应。

关于java - 在 Spring 中使用 ResponseBody 注释返回一个不工作的 Json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12449021/

相关文章:

java - Eclipse e4 - 对话框打开时隐藏部件

java - 关闭android应用,并在Home press上运行该功能

javascript - 使用 jquery 显示图例

java - Spring MVC Maven 模块

java 8 List<Pair<String, Integer>> 到 List<String>

java - 如何实现 JScrollPane 子行为?

javascript - 我的提交按钮不起作用

javascript - 我的函数参数有问题还是其他什么问题?

java - org.springframework.beans.factory.UnsatisfiedDependencyException : Error creating bean with name (controller)

java - 如何将新模型传递到 Spring WebFlow2 中的 View 状态