🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

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

Spring Boot

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

Q&A

解決済

1回答

11692閲覧

SpringBootでバリテーションでのエラーメッセージが表示できない

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

Spring Boot

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

0グッド

0クリップ

投稿2019/09/18 09:24

編集2019/09/19 07:02

やりたい事

現在入力フォームを空で入力した際に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>

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

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

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

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

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

guest

回答1

0

ベストアンサー

入力フォームの値はyyyy/MM/ddです。

とのことですが

<input class="form-control" type="date" name="register" />
htmlからControllerに値を渡した時点でコレの中身をコンソール出力してみてください。
yyyy-MM-dd形式になっていませんか?

投稿2019/09/19 07:35

tetutetu

総合スコア419

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

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

退会済みユーザー

退会済みユーザー

2019/09/19 08:53 編集

ご回答ありがとうございます。 コンソールで確認したところ、おっしゃる通りyyyy-MM-ddになっていました。 そのため、@DateTimeFormat(pattern="yyyy-MM-dd")に変更して試そうと思いましたが、htmlの方でtype="date"にしているためyyyy-MM-dd形式で入力ができない状態です 解決策としては、yyyy/MM/ddで受け取るようにする。 もしくはtype="text"に変更し、Entityのregisterの型をStringに変更し、カラムの型の変更・・・とまでしないといけないのでしょうか?そうなるとDate型で扱う必要がなくなってしまうので避けたいところですが、ご教授いただきたいです。
tetutetu

2019/09/19 09:00

全体像が把握できていないので的確な助言は致しかねますが Validate用のクラスを自前で作成して、[-]→[/]への置換を行った後にValidate処理等の実装は難しいでしょうか。
退会済みユーザー

退会済みユーザー

2019/09/19 09:14 編集

いえ、とても助かります。一度試してみます。 あと初歩的な質問になってしまいますが、Dateのimportをimport java.sql.Date;に無意識にしていましたが、このような使い方をする時はimport java.util.Date;が適切なのでしょうか?
退会済みユーザー

退会済みユーザー

2019/09/19 09:36 編集

今、根本的な改善には繋がっていないですが、 @NotNullと@DateTimeFormat(pattern="yyyy-MM-dd")を消し、 messages.propertiesにtypeMismatch.java.sql.Date={0}エラーメッセージを追記したところ、意図している動作は実現できました。 どうやらnullを型のミスマッチとして受け取っていたようなのでこのような改善策をとってみました。
q_sane_q

2019/09/19 10:04

横から失礼します。 見当違いの話であれば申し訳ございません > @DateTimeFormat(pattern="yyyy-MM-dd")に変更して試そうと思いましたが、htmlの方でtype="date"にしているためyyyy-MM-dd形式で入力ができない状態 とありますが、サーバにわたっている値はyyyy-MM-ddなので、@DateTimeFormat(pattern="yyyy-MM-dd") で判定してもいいと思うのですが、どうなのでしょうか?
tetutetu

2019/09/20 01:11 編集

>このような使い方をする時はimport java.util.Date;が適切なのでしょうか? 前述の通り全体像が把握できていないので ・時分秒を扱わない ・Date date = new Date()で現在時刻を取得しようとしない のであれば、このままでも良いのでは?程度の認識です。 (その他いくつかのメソッドに違いがあったはずなので、このままの利用で問題がないかどうかは一度調べてみたほうが良いかと思われます。) @DateTimeFormatについては、q_sane_q様のコメントの方が適切かなと思います。
退会済みユーザー

退会済みユーザー

2019/09/20 01:17

ありがとうございます。 私もそう思い試みてみましたが、なぜかタイプミスマッチエラーメッセージが表示されてしまいました。。。
退会済みユーザー

退会済みユーザー

2019/09/20 01:20

tetutetu様 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問