6月16日

バリデーションの利用

バリデーション用ライブラリをロードする

pom.xml の最後の </dependencies> の前に、以下のタグを追加する。

	<dependency>
		<groupId>javax.validation</groupId>
		<artifactId>validation-api</artifactId>
		<version>1.1.0.Final</version>
	</dependency>
	<dependency>
		<groupId>org.hibernate</groupId>
		<artifactId>hibernate-validator</artifactId>
		<version>5.0.1.Final</version>
	</dependency>

Missing artifact のエラーが出た人は、以下のサイトに書いてある内容を試してみること。
Resolve Error “ArtifactTransferException: Could not transfer artifact” or “Failure to Transfer” in Ma

  1. エクスプローラで C:\Users\se3\.m2 フォルダを選択
  2. lastUpdated で検索する
  3. ファイル名が lastUpdated で終わるファイルをすべて削除する
  4. プロジェクトエクスプローラでプロジェクトを右クリックし、[Maven]-[プロジェクトの更新]を実行する

MemoFormModelの変更

MemoFormModel.java にアノテーションを追加する。

public class MemoFormModel {
	@NotEmpty
	private String item;
	@Min(0)
	private Integer price;
	private Date buydate;
	private String memo;
	:
	以下略

memo.jspの変更

エラー表示用のタグを追加する。

	<table>
	<form:form modelAttribute="formModel">
		<tr>
			<td></td>
			<td><form:errors path="*" element="div" /></td>
		</tr>
		<tr>
			<td><form:label path="item">商品名</form:label></td>
			<td><form:input path="item" size="20"/></td>
		</tr>

MyMemoControllerの変更

	@RequestMapping(value = "/memo", method = RequestMethod.POST)
	public String form(@Valid @ModelAttribute MemoFormModel fm,
			BindingResult result, Model model) {
		if (result.hasErrors()) {
			model.addAttribute("title", "Sample [ERROR]");
			model.addAttribute("message", "値を再チェックしてください!");
			model.addAttribute("formModel", fm);
		} else {
			buylist.add(fm);
			model.addAttribute("title", "Sample");
			String res = "<ol>";
			res += "<li>" + fm.getItem() + "</li>";
			res += "<li>" + fm.getPrice() + "</li>";
			res += "<li>" + fm.getMemo() + "</li>";
			res += "<li>" + Calendar.getInstance().getTime() + "</li>";
			res += "</ol>";
			res += "<p>" + buylist.size() + "</p>";
			model.addAttribute("message", res);
			model.addAttribute("formModel", new MemoFormModel());
		}
		model.addAttribute("datalist", buylist);
		return "memo";
	}

spring6

なぜかJSPにメッセージが埋め込まれない。
こちらを参考にして、validation のテストを作ってみた。

package jp.abc;

import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;

import java.util.Set;

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;

import org.junit.Test;

public class MemoFormModelTest {

	@Test
	public void testItem() {
		ValidatorFactory vf = Validation.buildDefaultValidatorFactory();
		Validator v = vf.getValidator();
		MemoFormModel m = new MemoFormModel();
		Set&lt;ConstraintViolation&lt;MemoFormModel>> violations = v.validate(m);
        assertThat("", violations.size(), is(2));
        for (ConstraintViolation&lt;MemoFormModel> violation : violations) {
            System.out.println(violation.getPropertyPath() + " " + violation.getMessage());
        }

	}

}

コンソールには以下の出力があるので、メッセージは生成できている。

INFO  Version - HV000001: Hibernate Validator 5.0.1.Final
item may not be empty
price may not be null

以下のページに書かれいる対策で表示されるようになった。
Spring 3 MVC – form:errors not showing the errors

MyMemoController.java

	@RequestMapping(value = "/memo", method = RequestMethod.POST)
	public String form(@Valid @ModelAttribute("formModel") MemoFormModel fm,
					   BindingResult result, Model model) {

または、JSPとのやりとりに使っているFormModelを特定するためのキー文字列 formModel を、MemoFormModel の先頭1文字を小文字にしてやれば、エラーメッセージを表示されるようになる。

MyMemoController.java

	@RequestMapping(value = "/memo", method = RequestMethod.GET)
	public String memo(Model model) {
		model.addAttribute("title", "Sample");
		model.addAttribute("message", "買い物メモです");
		MemoFormModel fm = new MemoFormModel();
		model.addAttribute("memoFormModel", fm);
		model.addAttribute("detalist", buylist);
		return "memo";
	}

memo.jsp

	<form:form modelAttribute="memoFormModel">
		<tr>
			<td></td>
			<td><form:errors path="*" element="div" /></td>
		</tr>

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です