今回の記事はSpringBootのValidationを使って簡単に入力チェックを行う方法をご紹介する記事です。非常に便利な入力チェック用のモジュールSpringBootのValidationの使い方は是非この機会に押さえておきましょう。SpringBoot初心者の方で入力チェックを実装しようと考えている方は是非参考にしてみてください。
SpringBootプロジェクト構成
前回の記事で、ご紹介したSpringBoot+Mybatisを使ってDBからデータ取得とデータ表示を行う方法をご紹介しました。今回も復習を込めて上記の実装を行いますが、詳しくは下記記事を参照ください。
「SpringBoot+Mybatisを使ってDBからデータ取得とデータ表示を行う方法。」
ではまずはディレクトリ構成を見ていきましょう。
ディレクトリ構成
ディレクトリ構成は下記のようになっています。まずはクラスを追加して下記構成を作成するところまで行いましょう。とこに触っていないフォルダは省略しています。
.
├── build.gradle
└── src
├── main
│ ├── java
│ │ └── org
│ │ └── example
│ │ ├── Main.java
│ │ ├── controller
│ │ │ └── UserController.java
│ │ ├── dto
│ │ │ └── UserSearchRequest.java
│ │ └── service
│ │ └── UserService.java
│ └── resources
│ ├── application.properties
│ └── templates
│ └── index.html
プロジェクトの始め方やクラスの追加方法は下記リンクよりSpringBootプロジェクトの始め方を紹介しているので、そちらを参照ください。
「SpringBootプロジェクトの始め方。〜 HelloWorld 〜」
ライブラリのインストール
次にgradleの設定を行います。gradleでライブラリを管理していますが、gradle以外でも問題ないので下記ライブラリを追加してください。
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-devtools'
compileOnly 'org.projectlombok:lombok:1.18.8'
annotationProcessor 'org.projectlombok:lombok:1.18.8'
implementation 'org.springframework.boot:spring-boot-starter-tomcat'
implementation 'org.springframework.boot:spring-boot-starter-validation'
}
SpringBootプロジェクト作成
Controller作成
package org.example.controller;
import org.example.dto.UserSearchRequest;
import org.example.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
// コントローラー
@Controller
public class UserController {
// サービス
@Autowired
UserService userService;
// ルーティング
@GetMapping(value = "/user/search")
public String displaySearch(Model model) {
return "index";
}
@RequestMapping(value = "/user/id_search", method = RequestMethod.POST)
public String search(@ModelAttribute UserSearchRequest userSearchRequest, Model model) {
return "index";
}
}
ブラウザでのget通信とボタンを押して検索を行う2通りのルーティングを用意しました。
Dto作成
package org.example.dto;
import lombok.Data;
import java.io.Serializable;
// フォーム
@Data
public class UserSearchRequest implements Serializable {
private Long id;
}
こちらのDtoは検索条件用のフォームの要素を格納するDtoです。id検索を行うので、idを定義しています。
HTML作成
では最後にHTMLです。初期表示時にはフォーム情報がからであり、かつ初期表示で登録されているデータ全件を表示するようにしています。
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
<head>
<title>ユーザー情報検索</title>
<meta charset="utf-8" />
</head>
<body>
<h1>ユーザー情報検索</h1>
<form th:action="@{/user/id_search}" th:object="${userSearchRequest}" th:method="post">
<div>
ID:<input type="text" th:field="*{id}" />
</div>
<br />
<div>
<input type="submit" value="検索" />
</div>
<br />
</form>
</body>
</html>
こちらでSpringBootのプロジェクトが動くことを確認できると思います。
「http://localhost:8080/user/search」
上記にアクセスできれば問題ないです。
ではこのIDに入力チェックを付与します。
SpringBootプロジェクトにValidationで入力チェック
まずはDtoの入力フォームにValidationを付与します。
Dto作成
package org.example.dto;
import lombok.Data;
import java.io.Serializable;
// フォーム
@Data
public class UserSearchRequest implements Serializable {
@NotNull(message = "IDを入力してください")
private Long id;
}
これで、未入力(Null)の場合はエラーとなるようなるチェックです。
このチェック結果をControllerで受け取ります。
Controllerで入力チェック結果取得
package org.example.controller;
import org.example.dto.UserSearchRequest;
import org.example.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.validation.annotation.Validated;
// コントローラー
@Controller
public class UserController {
// サービス
@Autowired
UserService userService;
// ルーティング
@GetMapping(value = "/user/search")
public String displaySearch(Model model) {
return "index";
}
@RequestMapping(value = "/user/id_search", method = RequestMethod.POST)
public String search(@Validated @ModelAttribute UserSearchRequest userSearchRequest, BindingResult result, Model model) {
// エラーチェック
if (result.hasErrors()) {
List<String> errorList = new ArrayList<String>();
for (ObjectError error : result.getAllErrors()) {
errorList.add(error.getDefaultMessage());
}
model.addAttribute("validationError", errorList);
}
return "index";
}
}
先ほどまでとの違いは下記です。
public String search(@ModelAttribute UserSearchRequest userSearchRequest, Model model) {
↓
public String search(@Validated @ModelAttribute UserSearchRequest userSearchRequest, BindingResult result, Model model)
// エラーチェック
if (result.hasErrors()) {
List<String> errorList = new ArrayList<String>();
for (ObjectError error : result.getAllErrors()) {
errorList.add(error.getDefaultMessage());
}
model.addAttribute("validationError", errorList);
}
引数でvalidationの結果を取得しているのと、エラーがあった場合HTMLに「ValidationError」というオブジェクトを渡しています。これをHTML側で表示すれば入力チェックの表示が完了です。
HTML作成
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
<head>
<title>ユーザー情報検索</title>
<meta charset="utf-8" />
</head>
<body>
<table>
<tr th:if="${validationError}" th:each="error : ${validationError}">
<td style="color: red;" th:text="${error}"></td>
</tr>
</table>
<h1>ユーザー情報検索</h1>
<form th:action="@{/user/id_search}" th:object="${userSearchRequest}" th:method="post">
<div>
ID:<input type="text" th:field="*{id}" />
</div>
<br />
<div>
<input type="submit" value="検索" />
</div>
<br />
</form>
</body>
</html>
空欄で検索を行うとエラーが表示されると思いますので、確認してみてください。
Validationには他にも多数の種類があります。
SpringBootのValidationの種類
アノテーション | 説明 |
---|---|
@NotNull | null でないことを検証する。 |
@Null | null であることを検証する。 |
@NotEmpty | 文字数または配列の要素数が 0 でないことを検証する。 |
@NotBlank | 文字列がnull でないかつ空文字でないことを検証する。 |
@Size(min=, max= ) | 文字数または配列の要素数が範囲内であることを検証する。 |
@Length(min=, max= ) | 文字数が範囲内であることを検証する。 |
@Max() | 整数が指定値以下であることを検証する。 |
@Min() | 整数が指定値以上であることを検証する。 |
@Range(min=, max= ) | 整数が範囲内であることを検証する。 |
@Positive | 数値が正であることを検証する。 |
@PositiveOrZero | 数値が正か 0 であることを検証する。 |
@Negative | 数値が負であることを検証する |
@NegativeOrZero | 数値が負か 0 であることを検証する。 |
@DecimalMax | 数値が指定値以下であることを検証する。 |
@DecimalMin | 数値が指定値以上であることを検証する。 |
@Digits(integer= ,fraction= ) | 整数部(integer )と小数部(fraction )が指定した桁数以内であることを検証する。 |
@AssertFalse | false であることを検証する。 |
@AssertTrue | true であることを検証する。 |
@Future | 日付が未来であることを検証する。 |
@FutureOrPresent | 日付が未来であるか今日であるかを検証する。 |
@Past | 日付が過去であることを検証する。 |
@PastOrPresent | 日付が過去であるか今日であるかを検証する。 |
@URL | 文字列が正しい URL(RFC2396)であることを検証する。 |
@Email | 文字列が正しいメールアドレス(RFC2822)であることを検証する。 |
@CreditCardNumber | 文字列が正しいクレジットカード番号であることを検証する。 |
@Pattern(regexp= ) | 文字列が正規表現にマッチすることを検証する。 |
@Valid | ネストしたクラスのバリデーションを実行する。 |
では今回の記事は以上です。他にもSpringBoot関連の記事を記載しているので、是非サイト内みて行ってください。
コメント