![](/img/trans.png)
[英]Send json object with another parmeter to the controller in 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.