私の見解では、次のような状況があります。
<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 オブジェクトは、次のようなfooとfruitと 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 アンドレア