【问题标题】:ajax POST + spring controller parameter passing errorajax POST + spring控制器参数传递错误
【发布时间】:2015-08-25 08:16:36
【问题描述】:

我在将 POST 请求中的 Int 参数传递给 Spring MVC 控制器时遇到了奇怪的问题。

问题是一个参数通过POST传递,但没有被控制器解析。

代码如下: 弹簧控制器:

@Controller
@RequestMapping("user")
public class UserController {
    @RequestMapping(value = "/register", method = RequestMethod.POST)
    @ResponseBody
    public JsonResponse AddUser(@RequestBody User user){
        System.out.println(user.getCondoID());
        System.out.println(user.getPassword());
        System.out.println(user.getUsername());

        *** SOME MY STUFF ***
}

用户模型:

public class User {
    private String username;
    private String password;
    private int condo_id;
    private List<String> roles;

    public List<String> getRoles() {
        return roles;
    }
    public void setRoles(List<String> roles) {
        this.roles = roles;
    }

    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }

    public int getCondoID() {
        return condo_id;
    }
    public void setCondoID(int condo_id) {
        this.condo_id = condo_id;
    }
}

我如何在 Angular 中发送 POST(示例):

$scope.choosenCondo.id = "7";
var formData = {
    "username" : $scope.registerUser.email,
    "password" : $scope.registerUser.password,
    "condo_id" : parseInt($scope.choosenCondo.id)
};

var req = {
    method: 'POST',
    url: '/api/user/register',
    headers: {
        'X-CSRF-TOKEN': $('input[name="_csrf"]').val(),
        'Upgrade-Insecure-Requests': "1",
        //'Content-Type': "application/x-www-form-urlencoded"
        'Content-Type': 'application/json'
    },
    data: formData
}

$http(req)

所以,对于System.out.println(user.getCondoID());,我在日志中收到“0”。 但是 POST 数据看起来像这样,例如:{"username":"4t654y54y54y","password":"1q2w3e","condo_id":2} 所以参数是在 POST 中发送的。造成这种麻烦的原因是什么?

【问题讨论】:

  • 也许您的 condo_id 变量的getter/setter 没有遵循命名约定,因此 condo_id 无法正确序列化。您可以尝试为getCondo_id()setCondo_id(int condo_id) 更改这些方法吗?或将变量名从 condo_id 更改为 condoId。
  • 另一种猜测——用户类可能需要默认构造函数。
  • “你能不能试试改变这些方法”改成什么?
  • getCondoID() -> getCondo_id()setCondoID(int condo_id) -> setCondo_id(int condo_id).
  • 为您的变量/方法使用正确的驼峰式。 int condo_id 将变为 Integer condoId(更喜欢使用对象而不是原语)。接下来让您的 IDE 生成 getter/setter。

标签: java ajax angularjs spring spring-mvc


【解决方案1】:

你的用户模型应该是这样的

public class User {
    private String username;
    private String password;
    private int condo_id;
    private List<String> roles;

    public List<String> getRoles() {
        return roles;
    }
    public void setRoles(List<String> roles) {
        this.roles = roles;
    }

    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }

    public int getCondo_id() {
        return condo_id;
    }

    public void setCondo_id(int condo_id) {
        this.condo_id = condo_id;
    }

    /*
    public int getCondoID() {
        return condo_id;
    }
    public void setCondoID(int condo_id) {
        this.condo_id = condo_id;
    }
    */
}

没有找到真正的setter方法来设置属性“condo_id”的值。

So, for System.out.println(user.getCondoID()); i receive "0" in log. 

由于java性质,原始值默认初始化为0,所以打印的是0

【讨论】:

  • private Integer condo_id; 声明为Interger 这有帮助:)
  • 当你定义为private Integer condo_id;时,如果没有值进来就会被初始化为null,
  • 当你定义为private int condo_id;时,如果没有值进来会抛出异常,NULL不能赋给原始类型
  • 值即将到来,它没有被解析。 private Integer condo_id; 这有帮助
猜你喜欢
  • 2012-12-04
  • 1970-01-01
  • 1970-01-01
  • 2016-08-14
  • 1970-01-01
  • 2016-07-29
  • 1970-01-01
  • 2013-11-25
  • 1970-01-01
相关资源
最近更新 更多