我正在向我的控制器发送一个AJAX发布请求。然而,调用通过,作为参数发送的值为null。
AJAX JQUERY CALL:
var inValueURL = "/list/invalue";
var filter_data = {
supplierid: 1
};
$filterSupplierName.on('change',function(){
console.log("before ajax request");
$.ajax({
url: inValueUrl,
type: 'POST',
data:JSON.stringify(filter_data),
contentType: "application/json",
success: function (response) {
$("table").html(response);
},
error: function () {
//your error code
}
});
});
控制器:
@RequestMapping(value = "invalue", method = RequestMethod.POST,headers = "Accept=application/json")
@ResponseBody
public String redire(@RequestBody Value<Integer> supplierid ){
System.out.println(supplierid.getValue()); // this is null
return "success1";
}
价值等级:
public class Value<T> {
public Value() {}
public Value(T t) {
this.value = t;
}
private T value;
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
}
}
为什么supplierid保持为空。提前谢谢。
答案 0 :(得分:2)
您的控制器方法参数Value<Integer>
不为空,但value.getValue()
为空的原因是Spring尝试按名称将请求参数映射到域对象。您正在传递{supplierid=1}
作为数据,但您的目标对象value
没有setSupplierid
方法,因此对象已实例化,但未设置任何值。
根据您的需要,您的问题有几种解决方案。
<强> 1。使用@RequestParam
这似乎最简单的解决方案是将方法签名更改为始终期望名为supplierid
的整数:
@RequestMapping(value = "invalue", method = RequestMethod.POST,headers = "Accept=application/json")
@ResponseBody
public String redire(@RequestParam Integer supplierid ){
System.out.println(supplierid); // this is no longer null
return "success1";
}
<强> 2。使用Map
如果您的控制器并不总是知道它将接收哪种类型的数据,您只需将所有输入放入Map
并适当处理输入参数:
@RequestMapping(value = "invalue", method = RequestMethod.POST,headers = "Accept=application/json")
@ResponseBody
public String redire(@RequestBody Map<String,String> data ){
if (data.containsKey("supplierid")){
System.out.println(Integer.parseInt(data.get("supplierid"))); // this is no longer null
}
return "success1";
}
虽然这不是绝对必要的,但由于控制器方法中存在的HttpServletRequest
对象已包含所有输入参数的映射:
@RequestMapping(value = "invalue", method = RequestMethod.POST,headers = "Accept=application/json")
@ResponseBody
public String redire(HttpServletRequest request){
if (request.getParameterMap.containsKey("supplierid")){
System.out.println(Integer.parseInt(request.getParameterMap.get("supplierid")[0])); // this is no longer null
}
return "success1";
}
第3。使用自定义HandlerMethodArgumentResolver
如果您必须使用Value
类,则可以考虑扩展HandlerMethodArgumentResolver
类,该类负责将HTTP请求参数映射到Java对象。 Stack Overflow上有几个问题已经解决了这个问题。