spring控制器无法从$ http angular中检索数据

时间:2016-07-29 21:56:56

标签: javascript angularjs spring spring-mvc cors

我在角度和控制器中有一个$ http函数,但是控制器在日志打印中不检索从角度发送的数据

  

跳过CORS处理:响应已包含   "访问控制允许来源"头

我已将web.xml文件中的过滤器配置为标题

response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "Content-Type, x-requested-with");

我的角度函数是这个

     app.controller('LoadCardController', function($scope, $http) {

    $scope.executor = function() {

        var person = {
            name : 'Prueba',
            todayDate : 1469679969827
        };

        console.log("DATA=> ", data);

        $http({
            method : 'POST',
            url : 'http://localhost/myWeb/addPerson',
            data : person,
            headers : {
                'Content-Type' : 'application/json'
            }
        }).then(function successCallback(response) {
            console.log("success");
            console.log(response);
        }, function errorCallback(response) {
            console.log("error");
            console.log(response);

        });
    }

});

我的控制器就是这个......

@ResponseBody
            @RequestMapping(path = "/addPerson", method = RequestMethod.POST)
            public Person addPerson(final Person person) throws CustomException {

                person.setAge("18");
                person.setBithDay("15");

                LOGGER.trace("Add person with data {}", person);

                return person;

            }

            });
        }

当进入控制器时,person的数据为null,为name和todayDate属性,由我以角度发送。

我的控制器现在非常简单,因为只返回同一个人对象

2 个答案:

答案 0 :(得分:0)

根据您在此处显示的内容,似乎请求正在进行,但数据未在Spring控制器方法中的person参数上进行。可能有几个不同的原因。

首先,可能是请求体未被映射到Spring控制器方法的person参数。您可以通过在method参数之前使用@RequestBody注释(详细信息here)来告诉Spring自动执行此操作。在您的示例中:

@ResponseBody
@RequestMapping(path = "/addPerson", method = RequestMethod.POST)
public Person addPerson(@RequestBody Person person) throws CustomException {

    person.setAge("18");
    person.setBithDay("15");

    LOGGER.trace("Add person with data {}", person);

    return person;

}

如果这不能解决问题,则可能是Person类的问题。至少,它需要:

public class Person {
    private String name;
    private String age;
    private String bithday;
    private Date todayDate;

    public Person() {
        // this depends how your serialization is set up
    }

    // getters and setters...
}

一种惯例是使用单独的数据传输对象类(即PersonDto),它从请求主体获取数据并使用它构建Person对象(反之亦然),这样您就可以控制提交如何映射到后端。有关该模式的更多信息here

答案 1 :(得分:0)

我会给你一个选择

您的DTO

public class Person {
    private String name;
    private String todayDate;
    private String age;
    private String bithDay;
 // getter and setters, etc....

AngularJS使用:

// Every properties matches with your DTO, example: name, todayDate looks... 
var formData = new FormData();
formData.append("name", 'Prueba');
formData.append("todayDate"    , '1469679969827');

console.log("DATA=> ", formData);
$http({
       method : 'POST',
            url : 'http://localhost/myWeb/addPerson',
            data : formData,
            headers : {
                'Content-Type' : undefined
            }
        }).then(function successCallback(response) {
            console.log("success");
            console.log(JSON.stringify(response));
        }, function errorCallback(response) {
            console.log("error");
            console.log(response);

        });

根据我的情况,您在浏览器中登录Chrome看起来......

success
myjs.js:1744 {"data":{"name":"Prueba","todayDate":"1469679969827","age":"18","bithDay":"15"},"status":200