我有两个问题:
我认为这两个问题是不同的,但两者的解决方案都依赖于代码的相同部分。请问你能帮帮我吗?非常感谢提前!
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"}
答案 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;
}
}