かんがるーさんの日記

最近自分が興味をもったものを調べた時の手順等を書いています。今は Spring Boot をいじっています。

Spring Boot 1.3.x の Web アプリを 1.4.x へバージョンアップする ( その20 )( 気になった点を修正する )

概要

記事一覧はこちらです。

Spring Boot 1.3.x の Web アプリを 1.4.x へバージョンアップする ( その19 )( Spring Boot を 1.4.4 → 1.4.5 にバージョンアップする ) の続きです。

  • 今回の手順で確認できるのは以下の内容です。
    • 1.4 系へのバージョンアップとは直接関係ありませんが、修正した方がよさそうな点を修正します。

参照したサイト・書籍

  1. Spring Bootでバリデーションエラー時のメッセージリソースをValidationMessages.propertiesからmessages.propertiesにする
    http://qiita.com/NagaokaKenichi/items/65d0e07151292968d67f

目次

  1. application.properties から hibernate.dialect, spring.jpa.~ を削除する
  2. hibernate.properties を削除する
  3. ValuesEnumValidatorTest.java 内で定義しているクラスに static を追加する
  4. FreeMarkerUtils → FreeMarkerHelper へ変更する
  5. ValidationMessages_ja_JP.properties をやめて messages.properties に1本化する& IDEA の Transparent native-to-ascii conversion のチェックを外して UTF-8 の文字列のまま保存する
  6. clean タスク → Rebuild Project → build タスクを実行する

手順

application.properties から hibernate.dialect, spring.jpa.~ を削除する

Spring Boot で書籍の貸出状況確認・貸出申請する Web アプリケーションを作る ( その35 )( 貸出申請画面の作成6 )@SpringBootApplication アノテーションexclude = {JpaRepositoriesAutoConfiguration.class, HibernateJpaAutoConfiguration.class} を追加して JPA を無効にしましたが、不要になった設定を残したままにしていたので削除します。

  1. src/main/resources/application.properties を リンク先の内容 に変更します。

hibernate.properties を削除する

上で書いたように HibernateJpaAutoConfiguration.class は無効にしたので、関連する設定ファイルである hibernate.properties を削除します。

  1. src/main/resources/hibernate.properties を削除します。

ValuesEnumValidatorTest.java 内で定義しているクラスに static を追加する

Error Prone のバージョンアップの検証をしている時に static が付いていないという警告が出たので、付けることにします。

  1. src/test/java/ksbysample/webapp/lending/values/validation/ValuesEnumValidatorTest.javaリンク先の内容 に変更します。

FreeMarkerUtils → FreeMarkerHelper へ変更する

FreeMarkerUtils クラスは static メソッドを持っておらず、クラスに @Component アノテーションを付加しているので、Utils ではなく Helper クラスに変更します。

  1. Project Tool Window で ksbysample.webapp.lending.util パッケージの下の freemarker を ksbysample.webapp.lending.helper パッケージの下へ移動します。

    「Select Refactoring」ダイアログが表示されますので、そのまま「OK」ボタンをクリックします。

    f:id:ksby:20170408192611p:plain

    「Warning」ダイアログが表示されますが、これも「Yes」ボタンをクリックします。

    f:id:ksby:20170408192821p:plain

    「Move」ダイアログが表示されますので、そのまま「Refactor」ボタンをクリックします。

    f:id:ksby:20170408193033p:plain

  2. src/main/java/ksbysample/webapp/lending/helper/freemarker の下の FreeMarkerUtils クラスのクラス名を FreeMarkerHelper へ変更します。

    IntelliJ IDEA 2017.1 からなのか、クラスを選択して Shift+F6 を押しても「Rename」ダイアログが表示されませんでした。今回は修正箇所を1つずつ修正しています。バグ?

  3. src/test/groovy/ksbysample/webapp/lending/helper/freemarker の下の FreeMarkerUtilsTest クラスのクラス名を FreeMarkerHelperTest へ変更します。

  4. 以下のソースに記述されている FreeMarkerUtils freeMarkerUtilsFreeMarkerHelper freeMarkerHelper へ変更します。

    • src/main/java/ksbysample/webapp/lending/helper/mail/Mail001Helper.java
    • src/main/java/ksbysample/webapp/lending/helper/mail/Mail002Helper.java
    • src/main/java/ksbysample/webapp/lending/helper/mail/Mail003Helper.java
    • src/test/groovy/ksbysample/webapp/lending/helper/freemarker/FreeMarkerHelperTest.groovy

ValidationMessages_ja_JP.properties をやめて messages.properties に1本化する& IDEA の Transparent native-to-ascii conversion のチェックを外して UTF-8 の文字列のまま保存する

Bean Validation に Hibernate Validator を利用している場合、メッセージは ValidationMessages.properties に記述し、日本語が含まれるなら native-to-ascii で変換する必要がありますが、Spring Bootでバリデーションエラー時のメッセージリソースをValidationMessages.propertiesからmessages.propertiesにする の記事にメッセージを messages.properties に一本化する方法が記載されているのを見かけたので、メッセージは messages.properties に一本化し、かつ native-to-ascii を止めて UTF-8 のままで保存するようにします。

  1. src/main/java/ksbysample/webapp/lending/config/ApplicationConfig.javaリンク先の内容 に変更します。

  2. src/main/java/ksbysample/webapp/lending/config の下に WebMvcConfig.java を新規作成し、リンク先の内容 の内容を記述します。

  3. ValidationMessages_ja_JP.properties に定義されたメッセージを messages_ja_JP.properties へ移動します。また使用されていないメッセージを削除します。src/main/resources/messages_ja_JP.properties を リンク先の内容 に変更します。

  4. src/main/resources/ValidationMessages_ja_JP.properties を削除します。

  5. native-to-ascii の設定を解除します。まず src/main/resources/messages_ja_JP.properties のファイルの内容を IntelliJ IDEA とは別のテキストエディタ(メモ帳やサクラエディタ等)にコピーします。

  6. IntelliJ IDEA のメインメニューから「File」-「Settings…」を選択して「Settings」ダイアログを表示した後、以下の画面の「Transparent native-to-ascii conversion」のチェックを外します。

    f:id:ksby:20170408230832p:plain

  7. チェックを外した後に src/main/resources/messages_ja_JP.properties を開くとメッセージが AbstractUserDetailsAuthenticationProvider.locked=\u5165\u529B\u3055\u308C\u305F ID \u306F\u30ED\u30C3\u30AF\u3055\u308C\u3066\u3044\u307E\u3059 のように表示されるので、テキストエディタにコピーしておいたメッセージを戻します。

clean タスク → Rebuild Project → build タスクを実行する

最後に build, テストが正常に終了することを確認します。

  1. clean タスク → Rebuild Project → build タスクを実行して “BUILD SUCCESSFUL” が表示されることが確認できました。

    f:id:ksby:20170408235229p:plain

  2. Project Tool Window の src/test から「Run ‘All Tests’ with Coverage」を実行してテストが全て成功しました。

    f:id:ksby:20170409000955p:plain

ソースコード

application.properties

doma.dialect=org.seasar.doma.jdbc.dialect.PostgresDialect

spring.session.store-type=redis

spring.freemarker.cache=true
spring.freemarker.charset=UTF-8
spring.freemarker.enabled=false
spring.freemarker.prefer-file-system-access=false
  • 以下の設定を削除します。
    • hibernate.dialect=org.hibernate.dialect.PostgreSQL9Dialect
    • spring.jpa.hibernate.ddl-auto=none
    • spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.ImprovedNamingStrategy

ValuesEnumValidatorTest.java

@RunWith(SpringRunner.class)
@SpringBootTest
public class ValuesEnumValidatorTest {

    ..........

    // テスト用 POJO クラス
    @Data
    private static class NotAllowEmptyTestClass {
        @ValuesEnum(enumClass = TestValues.class)
        private String testStr;
    }

    // テスト用 POJO クラス
    @Data
    private static class AllowEmptyTestClass {
        @ValuesEnum(enumClass = TestValues.class, allowEmpty = true)
        private String testStr;
    }

    private Validator validator;

    ..........
  • NotAllowEmptyTestClass と AllowEmptyTestClass クラスの定義に static を追加します。

ApplicationConfig.java

@Configuration
public class ApplicationConfig {

    ..........

    private final MessageSource messageSource;

    /**
     * @param connectionFactory {@link ConnectionFactory} bean
     * @param messageSource     {@link MessageSource} bean
     */
    public ApplicationConfig(ConnectionFactory connectionFactory
            , MessageSource messageSource) {
        this.connectionFactory = connectionFactory;
        this.messageSource = messageSource;
    }

    ..........

    /**
     * Controller クラスで直接 {@link Validator} を呼び出すために Bean として定義している
     * また Hibernate Validator のメッセージを ValidationMessages.properties ではなく
     * messages.properties に記述できるようにするためにも使用している
     *
     * @return new {@link LocalValidatorFactoryBean}
     */
    @Bean
    public Validator validator() {
        LocalValidatorFactoryBean localValidatorFactoryBean = new LocalValidatorFactoryBean();
        localValidatorFactoryBean.setValidationMessageSource(this.messageSource);
        return localValidatorFactoryBean;
    }

    ..........
  • フィールド変数 private final MessageSource messageSource; を追加し、コンストラクタインジェクションを追加します。
  • validator メソッドの処理を上記のように変更します。localValidatorFactoryBean.setValidationMessageSource(this.messageSource); を呼び出すようにします。

WebMvcConfig.java

package ksbysample.webapp.lending.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.validation.Validator;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {

    private final Validator validator;

    /**
     * @param validator {@link Validator} bean
     */
    public WebMvcConfig(Validator validator) {
        this.validator = validator;
    }

    /**
     * Hibernate Validator のメッセージを ValidationMessages.properties ではなく
     * messages.properties に記述するために Override して {@link Validator} bean を返している
     *
     * @return {@link Validator} bean
     */
    @Override
    public Validator getValidator() {
        return validator;
    }

}

messages_ja_JP.properties

AbstractUserDetailsAuthenticationProvider.locked=入力された ID はロックされています
AbstractUserDetailsAuthenticationProvider.disabled=入力された ID は使用できません
AbstractUserDetailsAuthenticationProvider.expired=入力された ID の有効期限が切れています
AbstractUserDetailsAuthenticationProvider.credentialsExpired=入力された ID のパスワードの有効期限が切れています
AbstractUserDetailsAuthenticationProvider.badCredentials=入力された ID あるいはパスワードが正しくありません
UserInfoUserDetailsService.usernameNotFound=入力された ID あるいはパスワードが正しくありません

# Bean Validation 用メッセージ
error.size.max = {max}文字以内で入力して下さい。
javax.validation.constraints.NotNull.message=必須の入力項目です。
org.hibernate.validator.constraints.Email.message=メールアドレスを入力して下さい。
org.hibernate.validator.constraints.NotBlank.message=必須の入力項目です。
typeMismatch.java.lang.Long=数値を入力して下さい。

Global.optimisticLockException=既にデータが更新されているため更新できませんでした。データを読み込み直してください。

..........
  • 以下のメッセージを追加します。
    • error.size.max = {max}文字以内で入力して下さい。
    • javax.validation.constraints.NotNull.message=必須の入力項目です。
    • org.hibernate.validator.constraints.Email.message=メールアドレスを入力して下さい。
    • org.hibernate.validator.constraints.NotBlank.message=必須の入力項目です。
  • 以下のメッセージを削除します。
    • typeMismatch.java.math.BigDecimal=数値を入力して下さい。
  • 以下のメッセージは ValidationMessages_ja_JP.properties から移動せず削除します。
    • error.digits.integerandfraction = 数値を整数{integer}桁以内、小数{fraction}桁以内で入力して下さい。
    • error.digits.integeronly = 数値を整数{integer}桁以内で入力して下さい。

履歴

2017/04/09
初版発行。