13
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Java・SpringBoot・Thymeleaf】日本語でエラーを表示(SpringBootアプリケーション実践編5)

Posted at

ログインをして、ユーザー一覧を表示するアプリケーションを作成し、
Springでの開発について勉強していきます🌟
前回のエラーメッセージ実装に引き続きバリデーションエラーメッセージを編集して日本語化します

前回の記事🌟
【Java・SpringBoot・Thymeleaf】バリデーションエラーメッセージを変更(SpringBootアプリケーション実践編4)

#英語のメッセージを編集

  • バリデーションのエラーメッセージを編集するには、messages.propertiesにエラーメッセージを設定
  • エラーメッセージ設定方法
    • ①:<アノテーション名>..<フィールド名>=<エラーメッセージ>
    • ②:<アノテーション名>.<フィールド名>=<エラーメッセージ>
    • ③:<アノテーション名>.<フィールドのデータ型>=<エラーメッセージ>
    • ④:<アノテーション名>=<エラーメッセージ>
    • ⑤:<独自のキー名>=<エラーメッセージ>
      • ⑤:フォームクラスのフィールドと、独自のキーを紐付けなければいけないので、フォームクラスの修正が必要
      • ①~④:Springが自動でフォームクラスとメッセージの紐付けを行ってくれる
  • 以下でそれぞれ使い方を確認します🌟

##パターン①

  • <アノテーション名>.<ModelAttribute名>.<フィールド名>=<エラーメッセージ>

###フィールド名の表示

  • エラーメッセージの中にフィールド名を含めたい場合、**{0}**とメッセージ内に入力することで、フォームクラスのフィールド名を出してくれる
  • フィールド名がuserIdの時は、userIdを入力してくださいと表示されます

###メッセージ変更

  • 変更したいときは、**<Model.Attribute名>.<フィールド名>=<日本語のフィールド名>**で設定できる
    • **signupForm.userId=ユーザーID**の場合、エラーメッセージは
    • ユーザーIDを入力してくださいと表示される
    • (パターン③~⑤でも使える)

###パラメーターの表示

  • エラーメッセージの中に、パラメーターを表示したいときは
    • ex: パスワードは4桁以上、100桁以下で入力してくださいなど
    • フィールド名{0}以降の数値を指定することで、各パラメーターの値をメッセージに含めることができる
      • Length.signupForm.password={0}は、{2}桁以上、{1}桁以下で入力してください
      • SignupFormのpasswordフィールドに@Length(min=4,max=100)というアノテーションを設定
      • →maxが{1}、minが{2}に入る
  • パラメーターを修正してもメッセージに反映されるので、変更に強くなる!
messages.properties
#ユーザーID
signupForm.userId=ユーザーID
NotBlank.signupForm.userId={0}を入力してください
Email.signupForm.userId={0}にはメールアドレスを入力してください

#パスワード
signupForm.password=パスワード
NotBlank.signupForm.password={0}を入力してください
Length.signupForm.password={0}は、{2}桁以上、{1}桁以下で入力してください
Pattern.signupForm.password={0}は半角英数字で入力してください

#ユーザー名
signupForm.userName=ユーザー名
NotBlank.signupForm.userName={0}を入力してください

#誕生日
signupForm.birthday=誕生日
NotNull.signupForm.birthday={0}を入力してください

#年齢
signupForm.age=年齢
Min.signupForm.age={0}は{1}以上を入力してください
Max.signupForm.age={0}は{1}以下を入力してください

#結婚ステータス
AssertFalse.signupForm.marriage=未婚の方のみ登録できます

##パターン②

  • <アノテーションクラス名>.<フィールド名>=<エラーメッセージ>
  • アノテーション名とフィールド名だけを書く
  • 他のフォームクラスで同じフィールド名を使用した場合、同じメッセージが適用される
messages.properties
#ユーザーID
userId=ユーザーID
NotBlank.userId={0}を入力してください(パターン2)
Email.userId={0}にはメールアドレスを入力してください(パターン2)

#パスワード
password=パスワード
NotBlank.password={0}を入力してください(パターン2)
Length.password={0}は、{2}桁以上、{1}桁以下で入力してください(パターン2)
Pattern.password={0}は半角英数字で入力してください(パターン2)

#ユーザー名
userName=ユーザー名
NotBlank.userName={0}を入力してください(パターン2)

#誕生日
birthday=誕生日
NotNull.birthday={0}を入力してください(パターン2)

#年齢
age=年齢
Min.age={0}は{1}以上を入力してください(パターン2)
Max.age={0}は{1}以下を入力してください(パターン2)

#結婚ステータス
AssertFalse.marriage=未婚の方のみ登録できます(パターン2)

##パターン③

  • <アノテーション名>.<フィールドのデータ型>=<エラーメッセージ>
  • データ型に対してメッセージが紐付けられます。
messages.properties
#フィールド名
userId=ユーザーID
password=パスワード
userName=ユーザー名
birthday=誕生日
age=年齢

#バリデーションエラーメッセージ
NotBlank.java.lang.String={0}は必須入力です(パターン3)
Email.java.lang.String={0}はメールアドレス形式で入力してください(パターン3)
Length.java.lang.String={0}は、{2}桁以上、{1}桁以下で入力してください(パターン3)
Pattern.java.lang.String={0}は半角英数字で入力してください(パターン3)
NotBlank.java.lang.String={0}は必須入力です(パターン3)
NotNull.java.util.Date={0}を入力してください(パターン3)
Min.int={0}は{1}以上を入力してください(パターン3)
Max.int={0}は{1}以下を入力してください(パターン3)
AssertFalse.boolean=未婚の方のみ登録できます(パターン3)

##パターン④

  • <アノテーション名>=<エラーメッセージ>
  • アノテーションに対してメッセージを紐付ける
messages.properties
#フィールド名
userId=ユーザーID
password=パスワード
userName=ユーザー名
birthday=誕生日
age=年齢

#バリデーションエラーメッセージ
NotBlank={0}は必須入力です(パターン4)
Email={0}はメールアドレス形式で入力してください(パターン4)
Length={0}は、{2}桁以上、{1}桁以下で入力してください(パターン4)
Pattern={0}は半角英数字で入力してください(パターン4)
NotBlank={0}は必須入力です(パターン4)
NotNull={0}は必須入力です(パターン4)
Min={0}は{1}以上を入力してください(パターン4)
Max={0}は{1}以下を入力してください(パターン4)
AssertFalse=falseのみ登録できます(パターン4)

##パターン⑤

  • <独自のキー名>=<エラーメッセージ>
    • パターン①~④は、messages.properties編集のみでエラーメッセージを編集できたがパターン⑤の場合、コードを修正する
  • 独自のキーを設定する場合、各アノテーションと、独自キーの紐付けが必要になる
  • アノテーションにmessage属性を付けると、message.propertiesの独自キーと紐付けることができる
    • message="{<独自キー名>}"
    • @NotBlank(message = "{require_check}")
    • {}を付けない場合、設定した文字列がエラーメッセージとして表示される
  • 直接エラーメッセージを指定する場合は
@NotBlank(message="パスワードを入力してください")
String password;
SignupForm.java
package com.example.demo.login.domain.model;
import java.util.Date;
import javax.validation.constraints.AssertFalse;
import javax.validation.constraints.Email;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import org.hibernate.validator.constraints.Length;
import org.springframework.format.annotation.DateTimeFormat;
import lombok.Data;

@Data
public class SignupForm {
    //入力形式、メールアドレス形式
    @NotBlank(message = "{require_check}")
    @Email(message = "{email_check}")
    private String userId; //ユーザーID

    //入力必須、長さ4-100桁まで、半角英数字のみ
    @NotBlank(message = "{require_check}")
    @Length(min= 4 ,max = 100, message = "{length_check}")
    @Pattern(regexp = "^[a-zA-Z0-9]+$", message = "{pattern_check}")
    private String password; //パスワード

    //入力必須
    @NotBlank(message = "{require_check}")
    private String userName; //ユーザー名

    //入力必須
    @NotNull(message = "{require_check}")
    @DateTimeFormat(pattern = "yyyy/MM/dd")
    private Date birthday; //誕生日

    //値は20-100
    @Min(value=20, message = "{min_check}")
    @Max(value=100, message = "{max_check}")
    private int age; //年齢

    //falseのみ可能
    @AssertFalse(message = "{false_check}")
    private boolean marriage; //結婚ステータス

}
  • 独自キーを使う場合はValidationMessages.propertiesというファイルにメッセージを書く必要があるが、以下のmessages.propertiesファイルでも独自キーを使えるように設定する
  • 独自キーを使う場合、デフォルトのままでは日本語を使うと文字化けするため、文字コードの設定も必要

##messages.propertiesを編集

  • ユーザー登録用のフォームクラスに@NotNull(message="{require_check}")を追加した
  • message="{<キー名>}"に当たる部分とメッセージを、以下のように設定
    • require_check={0}は必須入力です(パターン5)
messages.properties
#フィールド名
userId=ユーザーID
password=パスワード
userName=ユーザー名
birthday=誕生日
age=年齢

#必須入力チェック
require_check={0}は必須入力です(パターン5)
#メールアドレス形式チェック
email_check={0}はメールアドレス形式で入力してください(パターン5)
#入力文字数チェック
length_check={0}は、{2}桁以上、{1}桁以下の桁数で入力してください(パターン5)
#フォーマットチェック
pattern_check={0}は半角英数字で入力してください(パターン5)
#下限値チェック
min_check={0}は{1}以上を入力してください(パターン5)
#上限値チェック
max_check={0}は{1}以下を入力してください(パターン5)
#ステータスチェック
false_check=falseの場合のみ登録できます(パターン5)

##WebConfig.javaを作成

  • フォームクラスとメッセージの紐付けを行う
WebConfig.java
package com.example.demo;

import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;

@Configuration
public class WebConfig {

    @Bean
    public MessageSource messageSource() {

        ReloadableResourceBundleMessageSource bean = new ReloadableResourceBundleMessageSource();
        //メッセージのプロパティファイル名(デフォルト)を指定します
        //下記ではmessages.propertiesファイルがセットされます
        bean.setBasename("classpath:messages");
        //メッセージプロパティの文字コードを指定します
        bean.setDefaultEncoding("UTF-8");
        return bean;
    }

    @Bean
    public LocalValidatorFactoryBean localValidatorFactoryBean() {
        LocalValidatorFactoryBean localValidatorFactoryBean = new LocalValidatorFactoryBean();
        localValidatorFactoryBean.setValidationMessageSource(messageSource());
        return localValidatorFactoryBean;
    }
}


#画面確認!

  • http://localhost:8080/login
  • ユーザー登録画面で、何も入力せずにユーザー登録ボタンをクリック
  • これで、入力チェックのエラーメッセージを日本語化できました〜〜〜
  • エラーメッセージを一覧表示するより、どこが間違っているのかを個別に表示した方が分かりやすいので、次回エラーメッセージを個別に表示する実装をします^^

日本語エラー.png

  • (補足)プロパティファイルにメッセージを定義するのではなく、ソースコードにエラーメッセージを直接指定することもできます
@NotBlank(message="必須入力です")
private String userId;
13
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?