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

EclipseのMavenを使った、Spring-MVC、Thymeleaf、MyBatis 等のプログラミングテクニックを、
備忘録的に記録しています。実際に動くソースコードを多用して説明していますので、
これからEclipseや、Spring-MVCを始めたいと思っている人にとって、少しでも参考になれば幸いです。
■応用の森 Spring-MVCによる、ファイルアップロード処理と例外処理
ファイルアップロードの最大ファイルサイズ指定の例外処理で大分はまってしまったので
備忘録として解説しておきます。

まず、ファイルアップロード画面のHTMLです。
ファイルを選択して、「ファイルアップロード」ボタンをクリックすると
アップロード処理ハンドラ「upload.xhtml」を実行します。
view (showupload.html)

 

次に、Spring設定ファイル (applicationContext.xml) でアップロードファイルサイズを指定します。
以下の設定を追加する(maxUploadSizeは適宜修正する事)。

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  <!-- ファイルアップロードの最大サイズ(byte単位)を指定する (-1:制限なしはNG)-->
  <property name="maxUploadSize" value="10240"/>
</bean>
■ファイルのアップロード例外処理
ネットでよく見かける、HandlerExceptionResolverをimplementsしたアップロードクラスが紹介されていますが、
実際この方式で試してみたところ、まともに動きませんでした。
ファイルアップロード画面のURL /fileupload.xhtml をたたいてみると、画面が表示されずに
いきなりエラー画面に飛んでしまいます。
コントローラは以下の様な割と単純なコードのJavaクラスです。
FileUpload.java

実行結果のログを確認すると、以下の様なログしか出力されません。
INFO - ==jp.dip.arimodoki.cntl.FileUpload:resolveException() Enter
INFO - ==jp.dip.arimodoki.cntl.FileUpload:resolveException() Leave
だいぶあれこれ試行錯誤しましたが解決しなかったので
HandlerExceptionResolverクラスを独立させる方式で試した結果なんとか解決したので、
これが正解かどうかはわかりませんが、以下解決方法を説明しておきます。
上のFileUpload.javaから、HandlerExceptionResolverを取り外した単純なコントローラにします。
FileUpload2.java
次に、HandlerExceptionResolverを独立させたクラスを作成します。
これは、コントローラではなく汎用的なクラスとします。
@Controllerアノテーションは付けない。
GlobalExceptionResolver.java

クラスに@Componentアノテーションを宣言することで、
このクラスがDIコンテナに自動的に登録され使用可能となります。
これで実行した結果、期待通りの動きとなりました。
やれやれ。