【问题标题】:Some doubts about @Valid annotation in Spring MVC validation formSpring MVC验证表单中@Valid注解的一些疑惑
【发布时间】:2012-12-31 00:48:22
【问题描述】:

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

<form id="readJson" class="readJsonForm" action="<c:url value="/messageconverters/json" />" method="post">
    <input id="readJsonSubmit" type="submit" value="Read JSON" />   
</form>

与这个form表单的提交事件相关(有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

水果 = 苹果

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 请求的正文字段中获取 JSON 对象,并使用 Jaxb2RootElementHttpMessageConverter 将其传输到新的 JavaBean 对象中

在我的例子中,JavaBean 对象是一个只有两个属性的对象:foofruit 以及 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 注释,但这与验证框架 JSR-303 验证 API 相关

我对这个 API 知之甚少,我记得 @Valid 触发了对象字段的验证

但我记得我的对象字段(我在 JavaBeans 对象中的变量)必须使用一些验证注释进行注释,例如 @NotNull 或使用实现我的个人验证器的个人验证 Java 类.

在这种情况下,我什么都没有,我的方法参数上只有 @Valid 注释...

在这种情况下具体做什么?

我唯一能想到的是检查我的 JSON 对象是否正确映射到 JavaBean 对象(如果具有相同的 valorized 属性),例如...如果 JSON 对象只有一个属性 valorized 进入错误...

有人可以帮助我吗?

Tnx 安德烈亚

【问题讨论】:

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


    【解决方案1】:

    首先:如果您要发送 Json,则需要将 consumes="application/json" 添加到您的 @requestmapping 注释中,反之亦然,如果您想发送 json 响应体,则需要添加。

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

    要获取控制器中的所有验证错误,您需要添加一个 BindingResult 类型的参数。此类包含所有验证错误。 没有什么能阻止控制器处理您的对象。您负责在绑定结果上调用“hasError”并采取相应措施。

    第三:由于你提到了 foo 和 bar 以及 JavaBean,看起来你正在使用展示应用程序。这个例子通常写得很好,解释得很好。尝试按原样部署应用程序并直接使用。我通过这个学习了大部分spring mvc。

    【讨论】:

    • 非常感谢,是的,我正在学习展示示例!我错了,因为我的 JavaBean 类的字段使用 @NotNull 验证注释进行了注释,这就是因为这个示例运行良好(字段不为空,所以这是正确验证的)唯一怀疑你所说的我是关于在我的 RequestMapping 注释中添加 consumes="application/json" 我知道消耗和产品的使用,但是在我发布的代码中没有它......也许这可能取决于因为这个例子取自转换器部分并展示 Spring 如何使用
    • 转换器将日期流(如文本)转换为某些不同的数据流(如 JSON 对象或 XML 对象)?
    猜你喜欢
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 2016-04-15
    • 2015-06-07
    • 1970-01-01
    • 2011-04-08
    • 2015-01-04
    相关资源
    最近更新 更多