0

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

<form id="readJson" class="readJsonForm" action="<c:url value="/messageconverters/json" />" method="post">
    <input id="readJsonSubmit" type="submit" value="Read JSON" />   
</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),以这种方式进行评估:

富=酒吧

水果 = 苹果

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 注释,但这与 Validation Framework JSR-303 Validation API 有关

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

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

在这种情况下,我对此一无所知,我的方法参数上只有@Valid注释......

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

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

有人可以帮助我吗?

Tnx安德烈亚

4

1 回答 1

0

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

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

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

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

于 2013-01-16T19:06:17.960 回答