0

私の見解では、次のような状況があります。

<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 関数は、次のように評価された 2 つのプロパティ (foo と fruit) を持つ新しい JSON オブジェクトを作成します。

フー=バー

果物=りんご

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 リクエストの body フィールドから JSON オブジェクトを取得し、Jaxb2RootElementHttpMessageConverter を使用してそれを新しい JavaBean オブジェクトに転送します。

私の場合、JavaBean オブジェクトは、次のようなfoofruitと getter、setter および toString() メソッドの2 つのプロパティのみを持つオブジェクトです。

@XmlRootElement public class 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オブジェクトに正しくマッピングされているかどうかを確認することです(同じプロパティが評価されている場合)。たとえば、JSONオブジェクトのプロパティが1つしか評価されていない場合はエラーになります.. .

誰かが私を助けることができますか?

Tnx アンドレア

4

1 に答える 1

0

まず、Jsonを送信する場合は、@requestmappingアノテーションにconsumes="application / json"を追加する必要があり、jsonレスポンスボディを送信する場合は、プロデュースの逆を行う必要があります。

2番目:@Validは、検証apiを呼び出して、コマンドオブジェクトのすべての制約durigmappigをチェックするために使用されます。したがって、hibernate-validatorのような実装をクラスパスに含める必要があります。実行時にそこにない場合はどうなるかわかりません。おそらくそれは無視されただけですか?

コントローラのすべての検証エラーを取得するには、BindingResultタイプのパラメータを追加します。このクラスは、すべての検証エラーを保持します。コントローラがオブジェクトを処理することを妨げるものは何もありません。あなたはbindingresultで「hasError」を呼び出す責任があり、それに応じて行動します。

3番目:JavaBeanと一緒にfooとbarについて言及しているので、showcaseアプリケーションを使用しているように見えます。この例は、一般的に非常によく書かれており、よく説明されています。アプリケーションをそのままデプロイして、直接試してみてください。私はこれを通して春のMVCのほとんどを学びました。

于 2013-01-16T19:06:17.960 に答える