无法在AJAX post请求中自动绑定到Spring MVC中的Java对象

时间:2013-09-20 15:04:50

标签: java jquery ajax json spring-mvc

我有两个问题:

  1. 无法将我的参数自动绑定到Java对象中(它们正在存在 使用AJAX发布jQuery)
  2. 我收到406错误,我认为这意味着我无法返回我想要的JSON对象
  3. 我认为这两个问题是不同的,但两者的解决方案都依赖于代码的相同部分。请问你能帮帮我吗?非常感谢提前!

    Ajax请求

    我正在尝试发布一个非常简单的对象,有一个电子邮件和一个名字,就像这样。

    var dataObject = {
        name : this.userName,
        email : this.userEmail,
    };
    this.$.ajax({
        type : "POST",
        url : '/stock-events/register-to-stock',
        contentType: "application/json",
        data : JSON.stringify(dataObject),
        success : function(data) {
            console.info("data");
        },
        dataType : 'json'
    });
    

    Spring MCV控制器

        @ResponseBody @RequestMapping(value = "/register-to-stock", method = RequestMethod.POST)
    public StockAlarmJsonResponse submitForm(@Valid @RequestBody StockAlarmModel stockAlarm,
            BindingResult result, Model m) {
        System.out.println("hola");
        System.out.println(stockAlarm);
        StockAlarmJsonResponse response = new StockAlarmJsonResponse();
        if (result.hasErrors()) {
            System.out.println(result);
            response.fail();
        }else{
            System.out.println(stockAlarm);
            response.success();
        }
        return response;
    }
    

    模型

      public class StockAlarmModel {
    
    
    @NotNull @Max(100) @Email
    private String email;
    
    @Max(100)
    private String name;
    
    @Override
    public String toString() {
        return "Email: " + email + '\n' + "Name: " + name;
    }
    }
    

    我在Java中遇到错误(看起来参数不存在)

     org.springframework.validation.BeanPropertyBindingResult: 1 errors
     Field error in object 'stockAlarmModel' on field 'email': rejected value [null]; codes   [NotNull.stockAlarmModel.email,NotNull.email,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [stockAlarmModel.email,email]; arguments []; default message [email]]; default message [may not be null]
    

    错误我遇到了chrome bug(看起来没有成功返回json对象)

      POST http://localhost:8080/stock-events/register-to-stock 400 (Bad Request) jquery-     1.9.1.js:8526
      send jquery-1.9.1.js:8526
      jQuery.extend.ajax jquery-1.9.1.js:7978
      StockAlarm.registerAlarm StockAlarm.js:131
      (anonymous function) StockAlarm.js:87
     jQuery.event.dispatch jquery-1.9.1.js:3074
    elemData.handle
    

    Chrome Bug显示的要求

    内容类型/应用Json

    请求有效负载:

    {"name":"santiago","email":"santiago@tiendanube.com"}
    

2 个答案:

答案 0 :(得分:0)

我的印象是jQuery会序列化这个

var dataObject = {
    name : this.userName,
    email : this.userEmail,
};

进入json,如

{"name" : "some username", "email" : "some email"}

因此,您希望Spring将JSON对象绑定到命令对象。将您的方法更改为

public @ResponseBody StockAlarmJsonResponse submitForm(@Valid @RequestBody StockAlarmModel stockAlarm, BindingResult result, Model m) {

请注意@RequestBody(可与@Valid一起使用)。 Spring将使用HttpMessageConverter尝试将JSON反序列化为StockAlarmModel的实例。我不确定该对象是否会直接添加到Model。如果需要,您可以随时自行添加。

AFAIK ModelAttribute尝试将请求参数绑定到命令对象。您的ajax请求中没有请求参数。

答案 1 :(得分:0)

我认为你的对象没有被正确创建。

如前所述,@ RequestBody将尝试将JSON对象反序列化为带注释的类型,但您需要在实体的类中包含 setters 。尝试将此添加到您的模型中:

public class StockAlarmModel {
  .
  .
  .
  public void setName(String name) {
    this.name = name;
  }
  public void setEmail(String email) {
    this.email= email;
  }
}