将复杂的json对象发送到Spring MVC控制器

时间:2014-08-27 07:56:24

标签: java ajax json spring spring-mvc

我正在尝试将复杂对象发送到spring mvc搜索引擎的ajax控制器,包含3个变量:当前页面,每页项目和搜索参数。问题是,控制器方法的声明不会将params变量作为Map。

因为我可以发送结构来分别收集控制器上的3个变量吗?

错误:

  

必需的Map参数'params'不存在

  var dataToSend = {
        'page': 1,
        'itemsPerPage': 10,
        'params': {
          'codItem': "10",
          'nameItem': "foo"
        }
      };  

      $.ajax({
        url: form.attr("action"),
        type: 'POST',
        data: JSON.stringify(dataToSend),
        dataType: 'json',
        cache: false
      }).success(function(data) {
        callback(data);
      });        




 public @ResponseBody HashMap<String, Object> search(@RequestParam(value="params") Map<String, String> params, @RequestParam(value = "page") int page, @RequestParam(value = "itemsPerPage") int itemsPerPage){
};

5 个答案:

答案 0 :(得分:2)

要正确执行此操作,您需要使用JSON库。春天与杰克逊捆绑在一起。

首先,您需要创建表示JSON的类。

public class MyJson {
  int page;
  int itemsPerPage;
  Map<String, String> params;

  public MyJson() {}

  ... getters/setters

}

您需要更改$ .ajax,发送此类数据{data:JSON.stringify(dataToSend)},因为参数需要,名称。

在你的控制器方法中写下:

ObjectMapper mapper = new ObjectMapper();

// readValue(youStringJson, destinactionClass)
MyJson json = mapper.readValue(data, MyJson.class);

如果你有MyJson params字段的getter,你可以迭代json.getParams()map。

答案 1 :(得分:1)

/* An Alternative Solution: See if this helps::::Sample Code of java,javascript,jsp for search parameters. Search Parameter POJO will have search parameters + Pagenumber + RecordCounton the page + sortColumn in it */

    public class SearchParameters implements Serializable{
        /**
         * 
         */
        private static final long serialVersionUID = 4847934022647742263L;
        private Integer pageNumber;
        private String sortColumn;
        private Integer recordCount;
        private String sortOrder;
        private Long gdsProductId; // some search parameter
        private Integer ruleId; // some search parameter

    //getter and setters

    }
/* your java controller method, which accepts the SearchParameter Object */

@RequestMapping(value = "/search", method = RequestMethod.POST)
@ResponseBody
public Map<String, GDS> search(SearchParameters parameters)
        throws Exception {
     // Print Parameter 
     logger.info("read :=" + parameters);
     // your logic to be written here
}

/* Your Javascript will have the below function.
   $("#searchPaginationform").serialize() will send the data for all the hidden elements of searchPaginationform in the below jsp.
  form  searchPaginationform will have hidden fields for the pagenumer,rows and other       elements */

    $.post('search.form', $("#searchPaginationform").serialize(), function (response) {

    }
/* Your Jsp -- see the hiddenfield name is matching the SearchParameter instance variable -*/

    <form:form id="searchPaginationform">
        <input type="hidden" name="gdsProductId" id="gdsProductId" >
        <input type="hidden" name="pageNumber" id="pageNumber" value=1>
        <input type="hidden" name="sortColumn" id="sortColumn" value="metamap_id">
        <input type="hidden" name="recordCount" id="recordCount" value=10>
        <input type="hidden" name="sortOrder" id="sortOrder" value="desc">
        <input type="hidden" name="ruleId" id="ruleId"> 
    </form:form>

答案 2 :(得分:0)

你可以简单地将HttpServletRequest注入你的Controller方法并自己阅读身体,如下所示:

public @ResponseBody HashMap<String, Object> search(HttpServletRequest request)
{

    String params;
    try 
    {
        params = IOUtils.toString( request.getInputStream());
        System.out.println(params);
    } 
    catch (IOException e) 
    {
        e.printStackTrace();
    }

   //Your return statement.
}  

OutPut:{"page":1,"itemsPerPage":10,"params":{"codItem":"10","nameItem":"foo"}}

您可以通过将JSON API sunch转换为GSON将此字符串转换为JSON对象来读取此属性。或者创建包含JSON中定义的所有属性的POJO,并将Json strig直接转换为POJO对象。

示例代码:

MyClass obj = new Gson().fromJson(params, MyClass.class);  

愿这对你有所帮助。

答案 3 :(得分:0)

我已经解决了以下问题:

public class SearchRequestDto {

  private String page;

  private String itemsPerPage;

  private MultiValueMap<String, List<String>> params;

  }

@ResponseBody
public HashMap<String, Object> buscador(SearchRequestDto searchRequest)
{
}

问题是它适用于示例的结构,如果我尝试获取表单参数,则不要将其作为json发送给我:

  $.ajax({
    url: form.attr("action"),
    type: 'POST',
    data: {  
      'params': form.serialize(),
      'page': start,
      'itemsPerPage': end  
    },
    dataType: 'json',
    cache: false
  }).success(function(data) {
    callback(data);
  });

结果:

itemsPerPage 5
page 1
params codItem=asdfasdf&namItem=asdfasdfasdf&tipItem=1000600&tipItem=1000492&public=on&private=on&provinceItem=15&munItem=262&munItem=270&munItem=276&capItem=123123

serializeArray():

itemsPerPage 5 第1页

params [10] [name] munItem
params [10] [value] 270
params [11] [name] munItem
params [11] [value] 276
params [13] [name] capItem
params [13] [value] 123123
params [2] [name] codItem
params [2] [value] asdfasdf
params [3] [name] nameItem
params [3] [value] asdfasdfasdf
params [4] [name] tipItem
params [4] [value] 1000600
params [5] [name] tipItem
params [5] [value] 1000492
params [6] [name] public
params [6] [value] on
params [7] [name] private
params [7] [value] on
params [8] [name] provinceItem
params [8] [value] 15
params [9] [name] munItem
params [9] [value] 262

我可以像在dataToSend的结构中那样发送它吗?唯一的方法是通过参数?

答案 4 :(得分:0)

我的环境: AngularJs,SpringMVC,Gson jsonobject

通常如果我从字体端到后端发送一个复杂的json对象,我会按照下面的通用方式处理它。

第一

$http({
    method: 'POST',
    url: contextPath+"/voice/submitWrapupForm",
    dataType: 'json',
    data: $.param({
              content : angular.toJson( { array:$(form).serializeArray() })
          }),
    headers: { 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' }
).success(function (data, status) {
    console.log(data);
});

我使用angularJs提交格式化的json字符串,我相信使用jquery ajax会是一样的,只需要确保你发送的数据是json格式的字符串。 https://docs.angularjs.org/api/ng/function/angular.toJson

第二

@RequestMapping(value = "/submitForm", method = RequestMethod.POST,headers = "Accept=application/json")
public @ResponseBody String submitForm(String content) {
    JsonObject j = new Gson().fromJson(content ,JsonElement.class).getAsJsonObject();
    return j.toString();
}
你可以看到json内容传递给mvc控制器,而在控制器你可以使用Gson转换和转换为json对象。