ajax对控制器的POST调用在spring中给出null值

时间:2015-07-20 18:55:13

标签: jquery ajax spring

我正在向我的控制器发送一个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保持为空。提前谢谢。

1 个答案:

答案 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上有几个问题已经解决了这个问题。