1
0

More than 1 year has passed since last update.

【Spring】Validation(入力チェック)

Last updated at Posted at 2022-04-10

概要

当記事では、
  ・標準機能のValidation
  ・独自実装Validation
の実装方法について説明します。

標準機能のValidation

必須チェックを実装したい場合を例にすると、
「javax.validation.constraints.NotEmpty」など
下記の「 @NotEmpty(message = "入力してください。") 」のように、
指定することで簡単に実装することができます。

@NotEmpty(message = "入力してください。")
public String mailAddress;

独自Validation

アノテーション実装

/ValidationDemo/src/main/java/com/example/demo/validation/UnavailableString.java
package com.example.demo.validation;

import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;

@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
@Constraint(validatedBy = { UnavailableStringValidator.class })
public @interface UnavailableString {
	String message() default "使用禁止文字を除去してください。";

	Class<?>[] groups() default {};

	Class<? extends Payload>[] payload() default {};

	String[] strings();
}

チェック処理実装

/ValidationDemo/src/main/java/com/example/demo/validation/UnavailableStringValidator.java
package com.example.demo.validation;

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

public class UnavailableStringValidator implements ConstraintValidator<UnavailableString, String> {

	private String[] strings;

	@Override
	public void initialize(UnavailableString unavailableString) {
		strings = unavailableString.strings();
	}

	@Override
	public boolean isValid(String value, ConstraintValidatorContext context) {
		for (String str : strings) {
			if (value.contains(str)) {
				return false;
			}
		}

		return true;
	}
}

アノテーション指定

上記で実装したアノテーションを、
下記の「@UnavailableString(strings = { "@","," })」のように、
フィールドに対して指定します。
※「strings」に指定した「@」と「,」が禁止文字になります。

@UnavailableString(strings = { "@","," })
public String name;

動作検証のための実装例

/ValidationDemo/src/main/java/com/example/demo/user/Check.java
package com.example.demo.user;

import javax.validation.constraints.NotEmpty;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.example.demo.validation.UnavailableString;

@Controller
@RequestMapping("user/check")
public class Check {

	/**
	 * ユーザチェック 入力
	 *
	 * @param model
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value = "/input", method = RequestMethod.GET)
	public String input() {
		return "user/check/input";
	}

	/**
	 * ユーザチェック 結果
	 *
	 * @param company
	 * @param result
	 * @param model
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value = "/result", method = RequestMethod.POST)
	public String result(@Validated @ModelAttribute User user, BindingResult result, Model model) throws Exception {
		model.addAttribute("user", user);

		return "user/check/result";
	}

	/**
	 * ユーザ
	 */
	public class User {

		@UnavailableString(strings = { "@","," })
		@NotEmpty(message = "入力してください。")
		public String name;

		@NotEmpty(message = "入力してください。")
		public String mailAddress;

		/**
		 * コンストラクタ
		 *
		 * @param name
		 * @param mailAddress
		 * @param mailAddressConfirm
		 */
		public User(String name, String mailAddress, String mailAddressConfirm) {
			this.name = name;
			this.mailAddress = mailAddress;
		}

		public String getName() {
			return name;
		}

		public void setName(String name) {
			this.name = name;
		}

		public String getMailAddress() {
			return mailAddress;
		}

		public void setMailAddress(String mailAddress) {
			this.mailAddress = mailAddress;
		}
	}
}
/ValidationDemo/src/main/java/com/example/demo/validation/UnavailableString.java
package com.example.demo.validation;

import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;

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

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

@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
@Constraint(validatedBy = { UnavailableStringValidator.class })
public @interface UnavailableString {
	String message() default "使用禁止文字を除去してください。";

	Class<?>[] groups() default {};

	Class<? extends Payload>[] payload() default {};

	String[] strings();
}
/ValidationDemo/src/main/java/com/example/demo/validation/UnavailableStringValidator.java
package com.example.demo.validation;

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

public class UnavailableStringValidator implements ConstraintValidator<UnavailableString, String> {

	private String[] strings;

	@Override
	public void initialize(UnavailableString unavailableString) {
		strings = unavailableString.strings();
	}

	@Override
	public boolean isValid(String value, ConstraintValidatorContext context) {
		for (String str : strings) {
			if (value.contains(str)) {
				return false;
			}
		}

		return true;
	}
}
/ValidationDemo/src/main/resources/templates/user/check/input.html
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>ValidationDemo - Input</title>
</head>
<body>
	<form action="result" method="POST">
		<div>
			name:<input type="text" name="name" />
		</div>
		
		<div>
			mailAddress:<input type="text" name="mailAddress" />
		</div>
	
		<button type="submit">送信</button>
	</form>
</body>
</html>
/ValidationDemo/src/main/resources/templates/user/check/result.html
<!DOCTYPE html>
<html lang="ja" xmlns:th="http://www.thymeleaf.org">
<head>
	<meta charset="UTF-8">
	<title>ValidationDemo - Result</title>
	<style>
		table{
		  border-collapse:collapse;
		}
		 
		table th{
		  border:1px solid #000066;
		  background:royalblue;
		}
		 
		table th,table td{
		  border:1px solid #000066;
		  background:#ffffff;
		}
	</style>
</head>

<body>
	<table>
		<thead>
			<tr>
				<th>#</th>
				<th>項目</th>
				<th>エラーメッセージ</th>
			</tr>
		</thead>
		<tbody>
			<tr>
				<td>1</td>
				<td>name</td>
				<td><p th:errors="*{user.name}"></p></td>
			</tr>
			<tr>
				<td>2</td>
				<td>mailAddress</td>
				<td><p th:errors="*{user.mailAddress}"></p></td>
			</tr>
		</tbody>
	</table>
</body>
</html>

動作確認

アプリを起動後、http://localhost:8080/user/check/inputを開きます。
image.png

下記の要領で入力し、「送信」ボタンをクリック。
name・・・禁止文字「@」を含む文字列を指定
mailAddress・・・未指定
image.png

  • name
    「@UnavailableString(strings = { "@","," })」で指定したチェックが効き、
    禁止文字エラーが表示されます。
  • mailAddress
    「@NotEmpty(message = "入力してください。")」で指定したチェックが効き、
    未入力エラーが表示されました。

image.png

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0