【发布时间】:2015-02-04 02:32:50
【问题描述】:
我正在使用 Spring 4 MVC 开发一个 Web 应用程序。我想知道我是否可以使用 javax.validation API 验证 JSON 请求对象。例如,我有这段 entity 代码:
...
@JsonProperty("cheFecha")
@NotNull
@Column(name = "che_fecha")
@Temporal(TemporalType.DATE)
@DateTimeFormat(style = "M-")
private Date SsiCheque.cheFecha;
@JsonProperty("cheMonto")
@NotNull
@JsonSerialize(using = CurrencySerializer.class)
@Column(name = "che_monto", precision = 10, scale = 2)
private BigDecimal SsiCheque.cheMonto;
...
我有控制器代码:
@RequestMapping(value = "/addCheck", method = RequestMethod.POST)
public @ResponseBody SsiCheque addChecks(@Valid SsiCheque ssiCheque, BindingResult result) {
//ssiCheque.persist();
System.out.println("add" + result.getErrorCount());// Zero when there are errors
return ssiCheque;
}
最后我得到了 jQuery 代码:
var formData = $("#formAddChecks :input").serializeArray();
$.ajax({
type: "POST",
url: "addCheck",
data: formData,
beforeSend: function ( xhr ) {
console.log("before Send");
},
error: function (request, status, error) {
console.log('Error ' + "\n" + status + "\n" + error);
},
success: function(data) {
console.log(data);
}
});
JSON 对象正确到达控制器,但我想使用实体 javax.annotations API 验证 JSON。我所看到的只是使用 自定义验证器 并“重写”验证代码。
这是验证 JSON 的唯一方法吗?
提前致谢!
更新 1
我遵循了@James Massey 的建议,我的代码现在看起来像这样:
控制器
@RequestMapping(value = "/addCheck", method = RequestMethod.POST)
@ResponseBody
public SsiCheque addChecks(@Valid @RequestBody SsiCheque ssiCheque, BindingResult result) {
//ssiCheque.persist();
System.out.println("agregar " + result.getErrorCount());
return ssiCheque;
}
Javascript 文件
var ssiCheque = {
cheNumero : $("#formAddChecks cheNumero").val(),
cheRecepto : $("#formAddChecks cheReceptor").val(),
cheMonto : $("#formAddChecks cheMonto").val(),
cheFecha : $("#formAddChecks cheFecha").val(),
cheConcepto : $("#formAddChecks cheConcepto").val()
};
$.ajax({
type: "POST",
contentType: "application/json",
url: "addCheck",
data: ssiCheque,
dataType: "json",
beforeSend: function ( xhr ) {
console.log("before Send");
},
error: function (request, status, error) {
console.log('Error ' /*+ request.responseText*/ + "\n" + status + "\n" + error);
},
success: function(data) {
console.log(data);
}
});
但是当我提交表单并执行 Ajax 功能 时,我收到了 400 错误(请求不正确)。我之前在json对象格式和控制器规格不兼容时遇到过这个错误,但这次我不知道为什么会出现这个错误。
再次感谢!
【问题讨论】:
-
使用 Jackson(类似)将 JSON 映射到对象,然后正常调用验证有什么问题?问题是你的绑定结果在传递无效数据时没有任何错误吗?
-
我在 cheFecha 字段中放了一个 @NotNull 注释,当我测试时,我发送 cheFecha null 并且它似乎正在跳过验证部分,因为我在 getErrorCount() 方法中为零
-
我认为它会被你奇怪的对象组合弄糊涂。从日期字段中删除
SsiCheque -
基本上是因为你的
SsiCheque对象不为空,满足约束,它不会更深入地检查对象。 -
我忘了说我的实体是由 Spring Roo 生成的,所以代码 SsiCheque.cheFecha 是生成代码的一部分。我不太了解,但我读过那是面向方面的编程(AOP)
标签: java jquery json spring validation