簡體   English   中英

將復雜的json對象發送到Spring MVC控制器

[英]Send complex json object to Spring MVC controller

我正在嘗試使用3個變量將復雜的對象發送給spring mvc搜索引擎的ajax控制器:當前頁面,每頁項和搜索參數。 問題在於,使用controller方法的聲明不會將params變量視為Map。

因為我可以分別發送結構以在控制器上收集3個變量?

錯誤:

所需的地圖參數“ 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){
};

要正確執行此操作,您需要使用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()映射。

/* 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>

您可以簡單地將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);  

希望這對您有幫助。

我已經解決了如下問題:

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的結構發送它一樣嗎? 唯一的方法是通過參數?

我的環境: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對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM