1

我有两个问题:

  1. 无法将我的参数自动绑定到 Java 对象中(它们是使用 AJAX 与 jQuery 一起发布的)
  2. 我收到 406 错误,我认为这意味着我无法返回我想要的 JSON 对象

我相信这两个问题是不同的,但两者的解决方案都依赖于代码的同一部分。请问你能帮帮我吗?提前非常感谢!

阿贾克斯请求

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

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'
});

弹簧 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 错误中遇到错误(看起来没有成功返回 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 错误显示请求的内容

内容类型/应用程序 Json

请求有效载荷:

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

2 回答 2

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。如果需要,您可以随时自行添加。

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

于 2013-09-20T15:10:28.577 回答
0

我认为您的对象创建不正确。

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

public class StockAlarmModel {
  .
  .
  .
  public void setName(String name) {
    this.name = name;
  }
  public void setEmail(String email) {
    this.email= email;
  }
}
于 2013-09-20T18:46:23.937 回答