POST 请求未映射到 Spring MVC 控制器

POST request not getting mapped to Spring MVC Controller

我正在从 Angularjs $http 服务发送 POST 请求。当我的承诺如下所示并正确映射到 Spring Controller ,

时,它工作正常

service.js

reassignKsaPendingLeads : function(data,username)
                                    {
    var promise = $http({
        url : "reassignPendingLeads.htm",
        method : "POST",
        data : mydata
        })
        .success(function(data, status, header, config, statusText)
        {
        }       
}

Spring 控制器

@RequestMapping({ "reassignPendingLeads.htm" })
    public @ResponseBody String updateAccessStatus(@RequestBody List<KsaLead> ksaLeads) 
    {
        log.info("Inside updateAccessStatus");
        return "true";
    }        

我从 service.js 传递的 json 对象正在正确映射到 @RequestBody 列表 ksaLeads。
由于 json 对象包含与 KsaLead 的 bean 属性相同的键。

但是现在我想传递另一个参数 username 除了 json body (data).
然后我得到 Request method 'POST' not supported in Spring Controller 。

新service.js

reassignKsaPendingLeads : function(data,username)
                                    {
                                        var mydata = JSON.stringify(data) + '&username=' + username;    
                                        var promise = $http({
                                            url : "reassignPendingLeads.htm",
                                            method : "POST",
                                            data : mydata
                                        })
                                        .success(function(data, status, header, config, statusText)
                                        {
                                        }

新的Spring控制器

@RequestMapping({ "reassignPendingLeads.htm" })
    public @ResponseBody String updateAccessStatus(@RequestBody List<KsaLead> ksaLeads,@RequestParam String username) 
    {
        log.info("Inside updateAccessStatus");
        return "true";
    }

任何人都可以指导我如何从 angularJs 传递数据,以便它正确映射到 Spring Controller

我假设您想将用户名作为请求参数传递。为此,$http 可以有一个 params 输入字段:

function(data,username) {
    var promise = $http({
        url: "reassignPendingLeads.html",
        method: "POST",
        data: data,
        params: { username: username }
    })
// continue with your promise here
}

如果你想在请求正文中传递它,我们必须执行以下步骤:

我们必须将 username 添加到 mydata 对象。

// we assume that data is not a primitive type
function(data,username) {
    var mydata;
    // check if data is defined
    if (data) {
        // make a deep copy first, since we don't want to modify the input
        mydata = angular.copy(data);
    } else {
        // if the data is undefined, create e new object
        mydata = {};
    }
    // add the username to mydata
    mydata.username = username;
    var promise = $http({
        url: "reassignPendingLeads.html",
        method: "POST",
        data: mydata
    })
// continue with your promise here
}

在后端我们必须确保我们可以接受这种数据。为此,建议创建一个数据 class,其中包含用户名和可能出现在前端 data 对象上的任何其他字段。 大概是这样的:

public class MyDataClass {
    private String username;
    // other fields

    // no args constructor
    public MyDataClass() {}

    // all args constructor
    public MyDataClass(String username) {
        this.username = username;
    }

   // getter and setters 
}

现在我们修改控制器接受它:

@RequestMapping(value = "reassignPendingLeads.htm", method = RequestMethod.POST)
    public @ResponseBody String updateAccessStatus(@RequestBody MyDataClass data) 
    {
        log.info(data.getUsername());
        return "true";
    }