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 系へのバージョンアップとは直接関係ありませんが、修正した方がよさそうな点を修正します。
参照したサイト・書籍
- Spring Bootでバリデーションエラー時のメッセージリソースをValidationMessages.propertiesからmessages.propertiesにする
http://qiita.com/NagaokaKenichi/items/65d0e07151292968d67f
目次
- application.properties から
hibernate.dialect
,spring.jpa.~
を削除する - hibernate.properties を削除する
- ValuesEnumValidatorTest.java 内で定義しているクラスに static を追加する
- FreeMarkerUtils → FreeMarkerHelper へ変更する
- ValidationMessages_ja_JP.properties をやめて messages.properties に1本化する& IDEA の Transparent native-to-ascii conversion のチェックを外して UTF-8 の文字列のまま保存する
- clean タスク → Rebuild Project → build タスクを実行する
手順
application.properties から hibernate.dialect
, spring.jpa.~
を削除する
Spring Boot で書籍の貸出状況確認・貸出申請する Web アプリケーションを作る ( その35 )( 貸出申請画面の作成6 ) で @SpringBootApplication
アノテーションに exclude = {JpaRepositoriesAutoConfiguration.class, HibernateJpaAutoConfiguration.class}
を追加して JPA を無効にしましたが、不要になった設定を残したままにしていたので削除します。
- src/main/resources/application.properties を リンク先の内容 に変更します。
hibernate.properties を削除する
上で書いたように HibernateJpaAutoConfiguration.class は無効にしたので、関連する設定ファイルである hibernate.properties を削除します。
- src/main/resources/hibernate.properties を削除します。
ValuesEnumValidatorTest.java 内で定義しているクラスに static を追加する
Error Prone のバージョンアップの検証をしている時に static が付いていないという警告が出たので、付けることにします。
- src/test/java/ksbysample/webapp/lending/values/validation/ValuesEnumValidatorTest.java を リンク先の内容 に変更します。
FreeMarkerUtils → FreeMarkerHelper へ変更する
FreeMarkerUtils クラスは static メソッドを持っておらず、クラスに @Component アノテーションを付加しているので、Utils ではなく Helper クラスに変更します。
Project Tool Window で ksbysample.webapp.lending.util パッケージの下の freemarker を ksbysample.webapp.lending.helper パッケージの下へ移動します。
「Select Refactoring」ダイアログが表示されますので、そのまま「OK」ボタンをクリックします。
「Warning」ダイアログが表示されますが、これも「Yes」ボタンをクリックします。
「Move」ダイアログが表示されますので、そのまま「Refactor」ボタンをクリックします。
src/main/java/ksbysample/webapp/lending/helper/freemarker の下の FreeMarkerUtils クラスのクラス名を FreeMarkerHelper へ変更します。
※IntelliJ IDEA 2017.1 からなのか、クラスを選択して Shift+F6 を押しても「Rename」ダイアログが表示されませんでした。今回は修正箇所を1つずつ修正しています。バグ?
src/test/groovy/ksbysample/webapp/lending/helper/freemarker の下の FreeMarkerUtilsTest クラスのクラス名を FreeMarkerHelperTest へ変更します。
以下のソースに記述されている
FreeMarkerUtils freeMarkerUtils
→FreeMarkerHelper 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 のままで保存するようにします。
src/main/java/ksbysample/webapp/lending/config/ApplicationConfig.java を リンク先の内容 に変更します。
src/main/java/ksbysample/webapp/lending/config の下に WebMvcConfig.java を新規作成し、リンク先の内容 の内容を記述します。
ValidationMessages_ja_JP.properties に定義されたメッセージを messages_ja_JP.properties へ移動します。また使用されていないメッセージを削除します。src/main/resources/messages_ja_JP.properties を リンク先の内容 に変更します。
src/main/resources/ValidationMessages_ja_JP.properties を削除します。
native-to-ascii の設定を解除します。まず src/main/resources/messages_ja_JP.properties のファイルの内容を IntelliJ IDEA とは別のテキストエディタ(メモ帳やサクラエディタ等)にコピーします。
IntelliJ IDEA のメインメニューから「File」-「Settings…」を選択して「Settings」ダイアログを表示した後、以下の画面の「Transparent native-to-ascii conversion」のチェックを外します。
チェックを外した後に 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, テストが正常に終了することを確認します。
clean タスク → Rebuild Project → build タスクを実行して “BUILD SUCCESSFUL” が表示されることが確認できました。
Project Tool Window の src/test から「Run ‘All Tests’ with Coverage」を実行してテストが全て成功しました。
ソースコード
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
初版発行。