关于Spring MVC验证表单中@Valid注释的一些疑问

时间:2013-01-16 16:16:45

标签: json spring validation spring-mvc bean-validation

我有以下情况,在我看来,我有以下形式:

<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 安德烈

1 个答案:

答案 0 :(得分:0)

首先:如果你是向下发送Json,你需要在你的@requestmapping注释中添加consumes =“application / json”,如果你想发送一个json响应体,则需要生成。

第二:@Valid用于调用验证api以检查命令对象的所有约束durig mappig。所以你需要在你的类路径中有一个像hibernate-validator一样的实现。我不确定如果它不在运行时会发生什么。可能它只是被忽略了?

要获取控制器中的所有验证错误,请添加BindingResult类型的参数。该类包含所有验证错误。 没有什么能阻止控制器处理你的对象。您有责任在bindingresult上调用“hasError”并相应地执行操作。

第三:既然你和JavaBean一起提到了foo和bar,看起来你正在使用showcase应用程序。这个例子一般写得非常好,并且很好地解释了。尝试按原样部署应用程序并直接进行游戏。我通过这个了解了大部分的春天mvc。