質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

1回答

2264閲覧

【springboot】バリデーションがエラーを検知してくれない

mitsuki_

総合スコア20

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2019/02/07 08:36

前提・実現したいこと

spring初心者です。
エンティティクラスにバリデーションを作成し、ブラウザで入力された値のバリデーションチェックを行い、エラーを赤文字で表示するという学習内容です。

発生している問題・エラーメッセージ

バリデータが作動(?)しません。
例えば、名前の入力項目は@MptEmptyをつけているのですが、空欄のままフォームを送信すると下記ホワイトラベルが表示されます。

Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback. Thu Feb 07 17:26:48 JST 2019 There was an unexpected error (type=Bad Request, status=400). Validation failed for object='formModel'. Error count: 1

該当のソースコード

1.controller
※エンティティのCRUDの学習を進めていたため、delete系などのメソッドが残ったままです。

java

1package com.tuyano.springboot; 2 3import java.util.Optional; 4 5import javax.annotation.PostConstruct; 6 7import org.springframework.beans.factory.annotation.Autowired; 8import org.springframework.stereotype.Controller; 9import org.springframework.transaction.annotation.Transactional; 10import org.springframework.validation.BindingResult; 11import org.springframework.validation.annotation.Validated; 12import org.springframework.web.bind.annotation.ModelAttribute; 13import org.springframework.web.bind.annotation.PathVariable; 14import org.springframework.web.bind.annotation.RequestMapping; 15import org.springframework.web.bind.annotation.RequestMethod; 16import org.springframework.web.bind.annotation.RequestParam; 17import org.springframework.web.servlet.ModelAndView; 18 19import com.tuyano.springboot.repositories.MyDataRepository; 20 21@Controller 22public class HeloController { 23 @Autowired 24 MyDataRepository repository; 25 26 @RequestMapping(value = "/", method = RequestMethod.GET) 27 public ModelAndView index(@ModelAttribute("formModel") MyData mydata, ModelAndView mav) { 28 mav.setViewName("index"); 29 mav.addObject("msg", "this is sample content."); 30 mav.addObject("formModel", mydata); 31 Iterable<MyData> list = repository.findAll(); 32 mav.addObject("datalist", list); 33 return mav; 34 } 35 36 @RequestMapping(value = "/", method = RequestMethod.POST) 37 @Transactional(readOnly = false) 38 public ModelAndView form(@ModelAttribute("formModel") @Validated MyData mydata, ModelAndView mov, 39 BindingResult result) { 40 ModelAndView res = null; 41 if (!result.hasErrors()) { 42 repository.saveAndFlush(mydata); 43 res = new ModelAndView("redirect:/"); 44 } else { 45 mov.setViewName("index"); 46 mov.addObject("msg", "sorry.error is occured..."); 47 Iterable<MyData> list = repository.findAll(); 48 mov.addObject("datalist", list); 49 res = mov; 50 } 51 52 return res; 53 } 54 55 @RequestMapping(value = "/edit/{id}", method = RequestMethod.GET) 56 public ModelAndView edit(@ModelAttribute MyData mydata, @PathVariable int id, ModelAndView mav) { 57 mav.setViewName("edit"); 58 mav.addObject("title", "edit mydata."); 59 Optional<MyData> data = repository.findById((long) id); 60 mav.addObject("formModel", data.get()); 61 return mav; 62 } 63 64 @RequestMapping(value = "/edit", method = RequestMethod.POST) 65 @Transactional(readOnly = false) 66 public ModelAndView update(@ModelAttribute MyData mydata, ModelAndView mav) { 67 repository.saveAndFlush(mydata); 68 return new ModelAndView("redirect:/"); 69 } 70 71 @RequestMapping(value = "/delete/{id}", method = RequestMethod.GET) 72 public ModelAndView delete(@PathVariable int id, ModelAndView mav) { 73 mav.setViewName("delete"); 74 mav.addObject("title", "delete my data"); 75 Optional<MyData> data = repository.findById((long) id); 76 mav.addObject("formModel", data.get()); 77 return mav; 78 } 79 80 @RequestMapping(value = "/delete", method = RequestMethod.POST) 81 @Transactional(readOnly = false) 82 public ModelAndView remove(@RequestParam long id, ModelAndView mav) { 83 repository.deleteById(id); 84 return new ModelAndView("redirect:/"); 85 } 86 87 @PostConstruct 88 public void init() { 89 //1つめのダミーデータ 90 MyData d1 = new MyData(); 91 d1.setName("tuyano"); 92 d1.setAge(123); 93 d1.setMail("tuyano@gmail"); 94 d1.setMemo("this is my data!"); 95 repository.saveAndFlush(d1); 96 //2つめのダミーデータ 97 MyData d2 = new MyData(); 98 d2.setName("hanako"); 99 d2.setAge(45); 100 d2.setMail("hanako@gmail"); 101 d2.setMemo("this is my flower!"); 102 repository.saveAndFlush(d2); 103 //3つめのダミーデータ 104 MyData d3 = new MyData(); 105 d3.setName("sachiko"); 106 d3.setAge(67); 107 d3.setMail("sachiko@gmail"); 108 d3.setMemo("this is my friend!"); 109 repository.saveAndFlush(d3); 110 111 } 112}

2.entity

java

1package com.tuyano.springboot; 2 3import javax.persistence.Column; 4import javax.persistence.Entity; 5import javax.persistence.GeneratedValue; 6import javax.persistence.GenerationType; 7import javax.persistence.Id; 8import javax.persistence.Table; 9import javax.validation.constraints.Email; 10import javax.validation.constraints.Max; 11import javax.validation.constraints.Min; 12import javax.validation.constraints.NotEmpty; 13import javax.validation.constraints.NotNull; 14 15@Entity 16@Table(name = "mydata") 17public class MyData { 18 19 @Id 20 @GeneratedValue(strategy = GenerationType.AUTO) 21 @Column 22 @NotNull 23 private long id; 24 25 @Column(length = 50, nullable = false) 26 @NotEmpty 27 private String name; 28 29 @Column(length = 200, nullable = true) 30 @Email 31 private String mail; 32 33 @Column(nullable = true) 34 @Min(0) 35 @Max(200) 36 private Integer age; 37 38 @Column(nullable = true) 39 private String memo; 40 41 public long getId() { 42 return id; 43 } 44 45 public void setId(long id) { 46 this.id = id; 47 } 48 49 public String getName() { 50 return name; 51 } 52 53 public void setName(String name) { 54 this.name = name; 55 } 56 57 public String getMail() { 58 return mail; 59 } 60 61 public void setMail(String mail) { 62 this.mail = mail; 63 } 64 65 public Integer getAge() { 66 return age; 67 } 68 69 public void setAge(Integer age) { 70 this.age = age; 71 } 72 73 public String getMemo() { 74 return memo; 75 } 76 77 public void setMemo(String memo) { 78 this.memo = memo; 79 } 80} 81

3.thymeleaf

html

1<!DOCTYPE html> 2<html xmlns:th="http://www.thymeleaf.org"> 3<head> 4<title>top page</title> 5<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 6<style> 7h1 { 8 font-size: 18pt; 9 font-weight: bold; 10 color: gray; 11} 12 13body { 14 font-size: 13pt; 15 color: gray; 16 margin: 5px 25px; 17} 18 19tr { 20 margin: 5px; 21} 22 23th { 24 padding: 5px; 25 color: white; 26 background: darkgray; 27} 28 29td { 30 padding: 5px; 31 color: black; 32 background: #f0f0f0; 33} 34 35.err { 36 color: red; 37} 38</style> 39</head> 40<body> 41 <h1 th:text="#{content.title}">helo page</h1> 42 <p th:text="${msg}"></p> 43 <table> 44 <form method="post" action="/" th:object="${formModel}"> 45 <ul> 46 <li th:each="error : ${#fields.detailedErrors()}" class="err" 47 th:text="${error.message}" /> 48 </ul> 49 <tr> 50 <td><label for="name">名前</label></td> 51 <td><input type="text" name="name" th:field="*{name}" /></td> 52 </tr> 53 <tr> 54 <td><label for="age">年齢</label></td> 55 <td><input type="text" name="age" th:field="*{age}" /></td> 56 </tr> 57 <tr> 58 <td><label for="mail">メール</label></td> 59 <td><input type="text" name="mail" th:field="*{mail}" /></td> 60 </tr> 61 <tr> 62 <td><label for="memo">メモ</label></td> 63 <td><textarea name="memo" th:field="*{memo}" cols="20" rows="5"></textarea></td> 64 </tr> 65 <tr> 66 <td></td> 67 <td><input type="submit"></td> 68 </tr> 69 </form> 70 </table> 71 <hr /> 72 <table> 73 <tr> 74 <th>ID</th> 75 <th>名前</th> 76 </tr> 77 <tr th:each="obj : ${datalist}"> 78 <td th:text="${obj.id}"></td> 79 <td th:text="${obj.name}"></td> 80 </tr> 81 </table> 82</body> 83</html>

補足情報

eclipse 4.8.0
springboot 2.1.1

おそれいりますが、どなたかご教示のほどよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

プリミティブ型に@NotNullを付けても正しく動作しません。

例えばこのようなラッパー側で扱うと、

java

1 @Data 2 public static class AgeModel { 3 @NotNull 4 @Max(value=30) 5 @Min(value=20) 6 private Integer age; 7 }

未入力の時は NotNull が、数値の範囲外なら、MaxやMinに定義されたエラーメッセージが出力されます。

投稿2019/02/07 16:09

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問