JavaのWebアプリケーション開発フレームワークによる、Webサイト開発の顛末記です。

EclipseのMavenを使った、Spring-MVC、Thymeleaf、MyBatis 等のプログラミングテクニックを、
備忘録的に記録しています。実際に動くソースコードを多用して説明していますので、
これからEclipseや、Spring-MVCを始めたいと思っている人にとって、少しでも参考になれば幸いです。
■Spring Boot の小径 第4歩 Spring Boot 匍匐前進
4-8)環境設定の外部ファイル注入
Spring Bootでは、すでにご理解いただいている通り、
設定ファイルで色々な追加機能をBean定義してDIコンテナに注入する方法がとれないため
4-2)入力チェックで紹介した、MessageConfig.javaで行ったような方法で実装する必要があります。
@Configurationアノテーションを付加したクラスを作成し、
必要な機能を持つメソッドを作成して、@Beanアノテーションを付加します。
ものによっては、WebMvcConfigurerAdapterクラスから継承したメソッドを
@Overrideアノテーションでオーバーライドします。
本来は、@Beanアノテーションだけでよいクラスと、WebMvcConfigurerAdapterクラスを継承したクラスを
別々に用意した方が良いとは思いますが、外部注入の定義が一括でできるので
ちょっと手抜きして一つのクラスにまとめてしまいました。
@Configurationアノテーションを付与することで、アプリケーション起動時にDIコンテナに登録されます。

Spring-MVCの設定ファイル(applicationContext.xml)では、メッセージリソースファイルの指定以外にも、
いくつかのクラスをBean定義しました。
ファイルアップロードサイズ制限や、ContentNegotiationConfigurerのON/OFF指定、
さらに、tomcatデプロイメント記述子(web.xml)では、DispatcherServletに対して
リクエストURLパターンの指定も行いました。
詳しくは、「■SpringMVC の小径 第4歩 Spring-MVCの初期設定」を読んでもらえれば
具体的に解説しています。

この節ではこれらの機能と、さらにその設定値を外部ファイル(application.properties)
から設定を注入するクラスWebConfig.javaをご紹介します。
前出のメッセージリソース定義クラス(MessageConfig.java)は、WebConfig.javaにまとめることにします。
まず、WebConfig.javaに設定する設定値を定義する外部ファイルを解説します。
src/main/resources/application.properties
これは、すでに「4-6)MyBatisによるDB連携」で出現済みですが
今回作成したWebConfig.java用に、新しく定義を追加してあります。

リクエストマッピングパターン、メッセージリソースファイル定義、ContentNegotiationConfigurer定義
ファイルアップロード最大サイズ定義の以上です。

定義の先頭に # がある項目はコメント扱いとなっており、
定義がない場合は、次に解説するコンフィグクラスでデフォルト値が使われます。

 

次に、アプリケーションコンフィグ設定クラスの実体です。
src/main/java/jp/dip/arimodoki/config/WebConfig.java

まず、クラスに対して@PropertySourceアノテーションで、注入する値を取得する外部ファイルを指定します。
このプロジェクトでは、application.properties を使います。
@PropertySourceアノテーションで、設定されている各種定義を読み込んで、クラス変数に取り込みます。
application.propertiesに未定義の場合はデフォルト値を定義しておきます。
デフォルト値は、それぞれのクラス変数の、@Valueアノテーションで指定します。
1)messageSourceメソッド
 メッセージリソースをDIコンテナに登録します。
 このプロジェクトでは、クラスパス(sec/main/resources)配下の、classpath:/ValidationMessagesを指定しています。

2)dispatcherRegistrationメソッド
 リクエストURLマッピングパターンをDIコンテナに登録します。
 このプロジェクトでは、*.xhtmlを指定しています。
 ※)ただしこれを使用すると、classpath:/static/ 配下のファイル拡張子が *.xhtml 以外判別しなくなってしまうので
   注意が必要です。
   具体的には、css、js、png などの静的コンテンツファイルが見えなくなってしまいます。
   詳しくは、次節で説明する予定です。

3)createMultipartResolverメソッド
 ファイルアップロード時の、サイズ制限を設定します。。

4)configureContentNegotiationメソッド
 このプロジェクトでは、リクエストURLマッピングパターンを。*.xhtmlとしていますが、
 この拡張子で、@RestController形式でJSONを返す場合、HTTP Status 406が返ってしまうため。
 これを防ぐため、設定をOFFにしています。

*5)addResourceHandlersSpringメソッド
 Spring Bootで扱う静的コンテンツ(css、 js、 imagesなど)のマッピングを
 実装しようと悪戦苦闘してみましたが、惨敗に終わっています。
 一応無残な敗北の備忘録として載せておきます。
 詳しくは、次節で紹介する予定です。

これで、Spring-MVCの設定ファイル(applicationContext.xml)で実装した機能は、
Spring Boot 環境でも一通りそろいました。
他に外部注入で追加したい機能が出てきたときは、この要領で
application.propertiesと、WebConfig.javaを拡張していけばよいことになります。