やりたい事
現在入力フォームを空で入力した際にmessage.propertiesに記述したエラーメッセージを出力するプログラムを書いています。
問題
Entityクラスのフィールド変数の中で、@NotNull private Date register;のエラーメッセージが意図しないメッセージが出ます。
解決策として、@DateTimeFormat(pattern="yyyy/MM/dd")も付与したところ意図したエラーメッセージが出たので解決したと思いきや、入力して登録した時にエラーが出ます。
入力フォームの値はyyyy/MM/ddです。
@DateTimeFormat(pattern="yyyy/MM/dd")を付与してない時は登録が○
@DateTimeFormat(pattern="yyyy/MM/dd")を付与した場合登録が×
@DateTimeFormat(pattern="yyyy/MM/dd")を付与してない時の空入力時は意図しないエラーメッセージ
@DateTimeFormat(pattern="yyyy/MM/dd")を付与している時の空入力時は意図したエラーメッセージ
という状況です。
@DateTimeFormat(pattern="yyyy/MM/dd")を付与して登録した時のエラー
Failed to convert property value of type java.lang.String to required type java.sql.Date for property register; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@javax.validation.constraints.NotNull @org.springframework.format.annotation.DateTimeFormat java.sql.Date] for value 2019-09-01; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [2019-09-01]
@DateTimeFormat(pattern="yyyy/MM/dd")を付与しないで空入力登録した時のエラー
Failed to convert property value of type java.lang.String to required type java.sql.Date for property register; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@javax.validation.constraints.NotNull java.sql.Date] for value '; nested exception is java.lang.IllegalArgumentException
解決方法をご教授ください・・・。
大まかに流れとしては、
❶Controllerの@GetMapping("new")newBookメソッドからnew.html(入力フォーム)へ。
❷入力もしくは空のまま作成ボタンを押し、Controllerの@PostMapping createメソッドで入力チェックし、処理を分ける。
です。
以下コードになります。
Controller
java
1@Controller 2@RequestMapping("/books") 3public class BookController { 4 @Autowired 5 private BookService bookService; 6 7 @GetMapping 8 public String index(Model model) { 9 List<Book>books = bookService.findAll(); 10 model.addAttribute("books", books); 11 return "books/index"; 12 } 13 private Map<String, String> selectCategory; 14 public Map<String, String> getSelectCategory(){ 15 Map<String, String> category = new LinkedHashMap<String, String>(); 16 category.put("A", "教育・自己啓発"); 17 category.put("B", "小説"); 18 category.put("C", "コミックス"); 19 category.put("D", "ビジネス・経済"); 20 category.put("E", "暮らし・健康・料理"); 21 category.put("F", "ライトノベル"); 22 return category; 23 } 24 25 @GetMapping("new") 26 public String newBook(@ModelAttribute Book book,Model model) { 27 selectCategory = getSelectCategory(); 28 model.addAttribute("selectCategory", selectCategory); 29 return "books/new"; 30 } 31 32 @GetMapping("{id}/edit") 33 public String edit(@PathVariable Long id, Model model) { 34 Book book = bookService.findOne(id); 35 model.addAttribute("book", book); 36 return "books/edit"; 37 } 38 39 @GetMapping("{id}") 40 public String show(@PathVariable Long id, Model model) { 41 Book book = bookService.findOne(id); 42 model.addAttribute("book", book); 43 return "books/show"; 44 } 45 46 @PostMapping 47 public String create(@ModelAttribute @Validated Book book, BindingResult bindingResult, Model model) { 48 if(bindingResult.hasErrors()) { 49 return newBook(book,model); 50 } 51 bookService.save(book); 52 return "redirect:/books"; 53 54 } 55 56 @PutMapping("{id}") 57 public String update(@PathVariable Long id, @ModelAttribute Book book) { 58 book.setId(id); 59 bookService.save(book); 60 return "redirect:/books"; 61 } 62 63 @DeleteMapping("{id}") 64 public String destroy(@PathVariable Long id) { 65 bookService.delete(id); 66 return "redirect:/books"; 67 } 68}
Entity
java
1@Getter 2@Setter 3@Entity 4public class Book { 5 6 @Id 7 @GeneratedValue(strategy = GenerationType.IDENTITY) 8 private Long id; 9 @NotBlank 10 private String title; 11 @NotBlank 12 private String person; 13 @NotNull 14 private Integer page; 15 @NotNull 16 private String selectCategory; 17 @NotNull 18 private Date register; 19 20 @Override 21 public String toString() { 22 return "Player [id=" + id + ", title=" + title + ", pseron=" + person + ", page=" + page + ", selectCategory=" + selectCategory + "]"; 23 } 24}
massages.properties
file
1#タイトル 2book.title=タイトル 3NotBlank.book.title={0}を入力してください 4#著者 5book.person=著者 6NotBlank.book.person={0}を入力してください 7#ページ数 8book.page=ページ数 9NotNull.book.page={0}を入力してください 10#カテゴリ 11book.selectCategory=カテゴリ 12NotNull.book.selectCategory={0}を選択してください 13#登録日 14book.register=登録日 15NotNull.book.register={0}を記入してください
new.html
html
1<!DOCTYPE html> 2<html xmlns:th="http://www.thymeleaf.org"> 3<head> 4<meta charset="utf-8" /> 5<title>New title - Book</title> 6<link rel="stylesheet" href="/css/bootstrap.css" /> 7<script src="/js/jquery.js"></script> 8<script src="/js/bootstrap.js"></script> 9</head> 10<body> 11 <div class="container"> 12 <h1>New Book</h1> 13 <form th:action="@{/books}" th:method="post" th:object="${book}"> 14 <!-- エラー用のCSS --> 15 <div class="form-group" 16 th:classappend="${#fields.hasErrors('title')}?'has-error'"> 17 <label class="control-label">タイトル</label> 18 <input class="form-control" type="text" name="title" /> <span 19 class="text-danger" th:if="${#fields.hasErrors('title')}" 20 th:errors="*{title}">error</span> 21 </div> 22 <!-- エラー用のCSS --> 23 <div class="form-group" 24 th:classappend="${#fields.hasErrors('person')}?'has-error'"> 25 <label class="control-label">著者</label> 26 <input class="form-control" type="text" name="person" /> <span class="text-danger" 27 th:if="${#fields.hasErrors('person')}" th:errors="*{person}">error</span> 28 </div> 29 <div class="form-group" 30 th:classappend="${#fields.hasErrors('page')}?'has-error'"> 31 <label class="control-label">ページ数</label> 32 <input class="form-control" type="number" name="page" /> <span 33 class="text-danger" th:if="${#fields.hasErrors('page')}" 34 th:errors="*{page}">error</span> 35 </div> 36 <!-- プルダウン --> 37 <div class="form-group" 38 th:classappend="${#fields.hasErrors('selectCategory')}?'has-error'"> 39 <select class="form-control" id="singleSelect" name="selectCategory"> 40 <option value="">カテゴリ</option> 41 <option th:each="category : ${selectCategory}" 42 th:value="${category.value}" th:text="${category.value}" 43 th:selected="${category.value} == *{selectCategory}">singleSelect</option> 44 </select> <span class="text-danger" 45 th:if="${#fields.hasErrors('selectCategory')}" 46 th:errors="*{selectCategory}">error</span> 47 </div> 48 <div class="form-group" 49 th:classappend="${#fields.hasErrors('register')}?'has-error'"> 50 <label class="form-control-label">登録日</label> 51 <input class="form-control" type="date" name="register" /> <span 52 class="text-danger" th:if="${#fields.hasErrors('register')}" 53 th:errors="*{register}">error</span> 54 </div> 55 <button class="btn btn-default" type="submit">作成</button> 56 </form> 57 <div class="pull-right"> 58 <a class="btn btn-link" href="/books">一覧画面へ</a> 59 </div> 60 </div> 61</body> 62</html>
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/09/19 08:53 編集
2019/09/19 09:00
退会済みユーザー
2019/09/19 09:14 編集
退会済みユーザー
2019/09/19 09:36 編集
2019/09/19 10:04
2019/09/20 01:11 編集
退会済みユーザー
2019/09/20 01:17
退会済みユーザー
2019/09/20 01:20