我正在尝试将复杂对象发送到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){
};
答案 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对象。