【问题标题】:Get back an Object List from a Spring controller to a AJAX request从 Spring 控制器获取对象列表到 AJAX 请求
【发布时间】:2016-09-01 13:05:45
【问题描述】:

我想从 Spring 控制器向 AJAX 请求返回一个对象列表。

AJAX 请求:

function doAjaxPost(date) {
    $.ajax({
        type : "POST",
        contentType : "application/json",
        url : "<%="/water-consumer" + homepageURL + "/hourConsumption"%>",
        data : date,
        dataType : 'json',
        success : function(response) {
            if(response != null)
                showHourConsumption(response);
        }
    });
}

弹簧控制器:

@RequestMapping(value = "/{username}/hourConsumption", method=RequestMethod.POST, produces="application/json")
public @ResponseBody List<HourConsumption> getHoursConsumptions(@RequestBody String day, HttpSession session, Model model) {
    // do something ....
    Household household = (Household)session.getAttribute("household");
    List<HourConsumption> consumptions = this.mrs.getHoursConsumption(household.getSmart_meter().getOid(), day);
    // do something 

    if(consumptions == null) //check if what get back from something is not null
        return null;
    else
        return consumptions; 
}

现在,AJAX 请求正常,所以我收到来自控制器的请求,它会生成正确的消耗(列表),但是当它返回列表时,浏览器会返回以下内容 错误:

加载资源失败:服务器响应状态为 406 (不接受)

有人可以告诉我如何做这件事或正确的方法吗? 非常感谢!

【问题讨论】:

    标签: java jquery ajax spring spring-mvc


    【解决方案1】:

    确保类路径中存在以下 2 个 jar。

    如果缺少任何一个或两个,则会出现此错误。

    jackson-core 和 jackson-mapper

    【讨论】:

    • 在 pom.xml 文件中添加什么正确的 以便在 Maven 配置中拥有这两个 jar?
    • org.codehaus.jacksonjackson-mapper-asl1.9. 13依赖>
    • com.fasterxml.jackson.corejackson-core2.8. 0
    【解决方案2】:

    几点建议:

    1. http 方法可以是 GET 和 POST。
    2. 删除会话和模型参数。如果您需要会话,则可以从 Autowired HttpServletRequest 获取。
    3. 确保您有 Jackson 作为依赖项

    【讨论】:

      【解决方案3】:

      问题在于您返回到浏览器的数据不是格式正确的 JSON。然后我会从你的控制器中删除属性“produces”,然后让 Spring Jackson 转换器创建 json 实体。

      将您的代码更改为:

      @RequestMapping(value = "/{username}/hourConsumption", method=RequestMethod.POST)
      public @ResponseBody List<HourConsumption> getHoursConsumptions(@RequestBody String day, HttpSession session, Model model) {
          // do something ....
          Household household = (Household)session.getAttribute("household");
          List<HourConsumption> consumptions = this.mrs.getHoursConsumption(household.getSmart_meter().getOid(), day);
          // do something 
      
          if(consumptions == null) //check if what get back from something is not null
              return null;
          else
              return consumptions; 
      }
      

      【讨论】:

        【解决方案4】:

        尝试使用 Google 的 gson (https://mvnrepository.com/artifact/com.google.code.gson/gson) 将 Json 格式的字符串发送到页面。

        弹簧控制器

        @RequestMapping(value = "/{username}/hourConsumption", method=RequestMethod.POST)
        public @ResponseBody String getHoursConsumptions(@RequestBody String day, HttpSession session, Model model) {
            String jsonFormatData = "";
            // do something ....
            Household household = (Household)session.getAttribute("household");
            List<HourConsumption> consumptions = this.mrs.getHoursConsumption(household.getSmart_meter().getOid(), day);
            // do something 
        
        
            // **Using Gson**
            // You can include this in your bean definition and autowire it
            // and use the singleton created by Spring.
            // For this example I am instantiating Gson myself
            Gson gson = new Gson(); 
        
            jsonFormatData = gson.toJson(consumptions);
        
            return jsonFormatData; 
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-11-12
          • 1970-01-01
          • 2012-05-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多