我有以下情况,在我看来,我有以下形式:
<form id="readJson" class="readJsonForm" action="<c:url value="/messageconverters/json" />" method="post">
<input id="readJsonSubmit" type="submit" value="Read JSON" />
</form>
与此表单表单的submit事件相关(具有class =“readJsonForm”)我有以下Jquery回调函数:
$("form.readJsonForm").submit(function() {
// Riferimento all'elemento che ha scatenato l'evento submit (il form)
var form = $(this);
var button = form.children(":first");// Seleziona il bottone submit
// OPERATORE CONDIZIONALE: il form ha classe "invalid" ?
var data = form.hasClass("invalid") ?
"{ \"foo\": \"bar\" }" : // SI: foo = bar
// NO: foo= bar ; fruit = apple
"{ \"foo\": \"bar\", \"fruit\": \"apple\" }";
/* AJAX CALL PARAMETER:
type: Say to the servlet tath the request is a POST HTTP Request
url: The address to which to send the call
data: the content of my data variable
contentType: an object having JSON format
dataType: the type of content returned by the server
*/
$.ajax({
type: "POST",
url: form.attr("action"),
data: data, contentType: "application/json",
dataType: "text",
success: function(text) { // CASO DI SUCCESSO:
/* Passa al metodo il testo ritornato dalla chiamata AJAX ed il
riferimento nel DOM al bottone accanto ala quale mostrare
tale output */
MvcUtil.showSuccessResponse(text, button);
},
error: function(xhr) { // CASO DI ERRORE
MvcUtil.showErrorResponse(xhr.responseText, button);
}
});
return false;
});
所以这个Jquery函数创建了一个新的JSON对象,它具有以这种方式增值的两个属性(foo和fruit):
foo = bar
fruit = apple
HTTP请求由我的控制器类的以下方法处理:
/* Metodo che gestisce HTTP Request di tipo POST dirette verso
* l'URL: "/messageconverters/json"
* @param L'oggetto JSON inserito all'interno del campo body dell'HTTP
* su cui viene eseguita una validazione
*
*/
@RequestMapping(value="/json", method=RequestMethod.POST)
public @ResponseBody String readJson(@Valid @RequestBody JavaBean bean) {
return "Read from JSON: " + bean;
}
此方法只是从HTTP Request的body字段中获取JSON对象,并使用Jaxb2RootElementHttpMessageConverter将其传输到新的JavaBean对象中
在我的例子中,JavaBean对象是一个只有两个属性的对象: foo 和 fruit 以及getter,setter和toString()方法,如下所示:
@XmlRootElement 公共类JavaBean {
@NotNull
private String foo;
@NotNull
private String fruit;
public JavaBean() {
}
public JavaBean(String foo, String fruit) {
this.foo = foo;
this.fruit = fruit;
}
// GETTER, SETTER & toString() methods
好的,所以JSON对象中的值被放在具有相同名称的JavaBean对象变量中......这件事对我来说非常清楚。
我对 @Valid 注释的规则有一些问题。
我的JavaBean参数使用 @Valid 注释进行了注释,阅读我已经了解的文档,这不是Spring注释,但这与Validation Framework JSR-303 Validation API有关
我只知道这个API,我记得@Valid触发了对象字段的验证
但我记得我的对象字段(我在JavaBeans对象中的变量)必须使用一些验证注释进行注释,例如 @NotNull 或使用实现我的个人验证器的个人验证Java类
在这种情况下,我对此一无所知,我的方法参数只有 @Valid 注释......
在这种情况下究竟做了什么?
我能想到的唯一一件事就是检查我的JSON对象是否与JavaBean对象正确映射(如果具有相同的valorized属性),例如......如果JSON对象只有一个属性值得进入错误...
有人可以帮助我吗?
TNX 安德烈
答案 0 :(得分:0)
首先:如果你是向下发送Json,你需要在你的@requestmapping注释中添加consumes =“application / json”,如果你想发送一个json响应体,则需要生成。
第二:@Valid用于调用验证api以检查命令对象的所有约束durig mappig。所以你需要在你的类路径中有一个像hibernate-validator一样的实现。我不确定如果它不在运行时会发生什么。可能它只是被忽略了?
要获取控制器中的所有验证错误,请添加BindingResult类型的参数。该类包含所有验证错误。 没有什么能阻止控制器处理你的对象。您有责任在bindingresult上调用“hasError”并相应地执行操作。
第三:既然你和JavaBean一起提到了foo和bar,看起来你正在使用showcase应用程序。这个例子一般写得非常好,并且很好地解释了。尝试按原样部署应用程序并直接进行游戏。我通过这个了解了大部分的春天mvc。