6月19日

メッセージのカスタマイズ

MemoFormModel.java のバリデーション用アノテーションにメッセージ引数を追加することで、エラーメッセージをカスタマイズできる。

public class MemoFormModel {
	@NotEmpty(message = "商品名は必須です。")
	private String item;
	@NotNull(message = "金額は必須です。")
	@Min(value = 0, message = "{value}以上の値が必要です。")
	private Integer price;

未入力でクエリ送信すると、カスタマイズされたエラーメッセージを表示した。

spring7

ValidatorMessages.propertiesを追加する

  1. Javaリソースの下の src/main/resources を右クリック
  2. [新規]-[その他]を選択
  3. 「一般」-「ファイル」を選択して「次へ」をクリック
  4. ファイル名に ValidatorMessages.properties を入力して「完了」をクリック

ファイルに以下の内容を入力。

NotEmpty = may not be empty.
Max = must be less than or equal to {1}.
Min = must be greater than or equal to {1}.
NotNull = may not be null.

日本語のエラーメッセージファイルも用意する。

  1. 作成した ValidatorMessages.properties を右クリックしてコピーする。
  2. src/java/resources を右クリックして貼り付ける。
  3. ファイル名を ValidatorMessages_ja.properties に変更して「OK」をクリック。

ファイルに以下の内容を入力して保存。

NotEmpty = {0} には、何か入力してください。
Max = {0} は、{1} 以上は入力できません。
Min = {0} は、{1} 以下は入力できません。
NotNull = {0} には、何か入力してください。

src/main/java/webapp/WEB-INF/mvc-config.xml に以下の内容を追加する。この設定によって、ValidatorMessages.properties と ValidatorMessages_ja.properties がエラーメッセージのファイルとして読み込まれる。

	<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
		<property name="basename" value="classpath:ValidatorMessages" />
	</bean>

spring8

ValidatorMessages_ja.properties に記述したメッセージを表示しない場合は、以下の操作を試してみる。

  • サーバーを再起動する
  • サーバーを右クリックして「クリーン」する
  • ファイル名が間違っていないか確認する

オリジナルのバリデータを作成する

金額をチェックするための PriceValidator を作成する。

jp.abc を右クリックして、[新規]-[クラス]を選択する。
クラス名: PriceValidator
インタフェース: ConstraintValidator<Price, Integer>

package jp.abc;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class PriceValidator implements ConstraintValidator<Price, Integer> {

	public void initialize(Price price) {
	}

	public boolean isValid(Integer input, ConstraintValidatorContext context) {
		if (input == null) {
			return false;
		}
		return true;
	}

}

jp.abc を右クリックして、[新規]-[注釈]を選択する。
名前: Price

package jp.abc;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import javax.validation.Constraint;
import javax.validation.Payload;

@Constraint(validatedBy = PriceValidator.class)
@Target( { ElementType.METHOD, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface Price {
	String message() default "please input a price.";
	Class<?>[] groups() default {};
	Class<? extends Payload>[] payload() default {};
}

MemoFormModel.java の金額部分のアノテーションを @Price に変更する。

public class MemoFormModel {
	@NotEmpty
	private String item;
	@Price
	private Integer price;
	private Date buydate;
	private String memo;

マイナスの金額をエラーにする。

PriceValidator.java を変更する。

	public boolean isValid(Integer input, ConstraintValidatorContext context) {
		if (input == null) {
			return false;
		}
		return input.intValue() >= 0;
	}

コメントを残す

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