簡易書籍登録アプリケーションの説明(バリデーション版)
7.3 簡易書籍登録アプリケーションの説明(バリデーション版)
7.2で作成したアプリケーションをもとに、エンティティを利用したバリデーション処理が実際どのような流れで動作しているのかを説明していきます。
7.3.1 Bookクラス(エンティティクラス)
1 アプリケーション作成の目的
まず初めに、エンティティクラスから確認していきましょう。
1 | package jp.co.f1.spring.bms.entity; |
3 | import jakarta.persistence.Entity; |
4 | import jakarta.persistence.Table; |
5 | import jakarta.persistence.Id; |
6 | import jakarta.persistence.Column; |
7 | import jakarta.validation.constraints.NotEmpty; |
10 | @Table(name="bookinfo") |
16 | @NotEmpty(message="ISBNを入力してください") |
19 | public String getIsbn() { |
23 | public void setIsbn(String isbn) { |
28 | @Column(length = 100, nullable = true) |
29 | @NotEmpty(message="タイトルを入力してください") |
32 | public String getTitle() { |
36 | public void setTitle(String title) { |
41 | @Column(length = 11, nullable = true) |
42 | @NotEmpty(message="価格を入力してください") |
45 | public String getPrice() { |
49 | public void setPrice(String price) { |
ここでは全てのプロパティにバリデーション用のアノテーションを1つずつ追加しました。こうすることで、未入力を許可しないようにしています。
また、アノテーションの引数内に message=”○○” という形でエラーメッセージを指定しています。もしこのルールに該当した場合はここで設定した値がメッセージとして表示されます。どちらもとても簡単ですね。
バリデーションのルールはまだ他にも多く用意されていますが、まず先に一連の流れから確認していきましょう。
7.3.2 BookControllerクラス(コントローラークラス)
元々コントローラーでもエンティティを利用していましたが、今回はバリデーション処理を行うことがポイントとなります。それでは確認していきましょう。
1 | package jp.co.f1.spring.bms.controller; |
3 | import org.springframework.stereotype.Controller; |
4 | import org.springframework.web.bind.annotation.GetMapping; |
5 | import org.springframework.web.bind.annotation.PostMapping; |
6 | import org.springframework.web.bind.annotation.ModelAttribute; |
7 | import org.springframework.web.servlet.ModelAndView; |
8 | import org.springframework.beans.factory.annotation.Autowired; |
9 | import org.springframework.validation.BindingResult; |
10 | import org.springframework.validation.annotation.Validated; |
12 | import jp.co.f1.spring.bms.repository.BookRepository; |
13 | import jp.co.f1.spring.bms.entity.Book; |
16 | public class BmsController { |
18 | // Repositoryインターフェースを自動インスタンス化 |
20 | private BookRepository bookinfo; |
25 | * 「/insert」へアクセスがあった場合 |
27 | @GetMapping("/insert") |
28 | public ModelAndView insert(@ModelAttribute Book book, ModelAndView mav) { |
31 | mav.addObject("book", book); |
34 | mav.setViewName("insert"); |
41 | * 「/insert」へPOST送信された場合 |
43 | @PostMapping(value = "/insert") |
44 | // POSTデータをBookインスタンスとして受け取る |
45 | public ModelAndView insertPost(@ModelAttribute @Validated Book book, BindingResult result, ModelAndView mav) { |
47 | if (result.hasErrors()) { |
49 | mav.addObject("message", "入力内容に誤りがあります"); |
52 | mav.setViewName("insert"); |
59 | bookinfo.saveAndFlush(book); |
62 | mav = new ModelAndView("redirect:/list"); |
■@ValidatedとBindingResult
フォームが送信されると、insertPostメソッドが呼び出されます。このメソッドには、3つの引数が用意されています。これがここでのポイントとなります。

第1引数にはBookインスタンスが渡されますが、これには2つのアノテーションが付けられています。1つは、 @ModelAttribute。これは既におなじみですね。
もう1つは「@Validated」。これが、このエンティティの値をバリデーションチェックします。これを付けることで、エンティティの各値を自動的にチェックするようになるのです。
■バリデーションエラーのチェック
バリデーションチェックの結果は、その後にある「BindingResult」という引数で知ることができます。これはErrorsというインターフェースを継承するサブインターフェースで、その名の通りアノテーションを使って値をバインドした結果を得ます。
ここでいえば、@ModelAttributeでフォームの値からBookインスタンスを作成する際の結果がBindingResultで得られることになります。インスタンスを作成するとき、@Validatedによってバリデーションがチェックされていますから、このBindingResultを調べればその状況がわかるのです。

エラーが発生しているかどうかは、「hasErrors」メソッドで調べられます。これは名前の通り、エラーが起こっているかどうかを知るもので、trueならばエラー有り、falseならばエラー無し、となるのです。したがって、この結果がfalseならばそのままBookを保存すればいい、というわけです。
trueの場合は、必要な値をaddObjectして再び “/insert” に戻って再入力を行ないます。
falseの場合は保存し、”/list” にリダイレクトさせています。
7.3.3 insert.html(テンプレートファイル)
NEXT>> 7.4 jakarta.validationによるアノテーション