【问题标题】:Cannot bind automatically in AJAX post request to a Java object in Spring MVC无法在 AJAX 发布请求中自动绑定到 Spring MVC 中的 Java 对象
【发布时间】:2013-09-20 15:04:49
【问题描述】:

我有两个问题:

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

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

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

弹簧 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"}

【问题讨论】:

  • 使用 firebug,向我们展示正在发送的实际请求正文。

标签: java jquery ajax json spring-mvc


【解决方案1】:

我的印象是 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 请求中没有请求参数。

【讨论】:

  • 我认为你已经为我指明了正确的方向,但是,我仍然无法让它发挥作用。我已经改变了请求的完成方式,我已经指定它发送内容类型 json,并且我还将对象本身转换为 json(参见上面的编辑)。现在,问题是我什至没有到达控制器,这意味着我无法执行 println。
  • @user 将您的记录器设置为跟踪/调试并检查任何消息。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-24
    • 1970-01-01
    • 2011-04-02
    • 1970-01-01
    相关资源
    最近更新 更多