10670
Spring MVC+VelocityでWebアプリを開発をしています。

最大ファイルサイズ（現状1MB）を超えるファイルをアップロードされた場合のエラーハンドリングをどうすれば良いのか分からず困っております。

下記サイトのように共通のエラーページに遷移させることは可能です。  
[<http://kuwalab.hatenablog.jp/entry/spring_mvc41/026>](http://kuwalab.hatenablog.jp/entry/spring_mvc41/026)

ですが、今回実現したい仕様としては  
画面Aを表示→1MBを超えるファイルをアップロード→画面Aにエラーメッセージを表示  
画面Bを表示→1MBを超えるファイルをアップロード→画面Bにエラーメッセージを表示  
というように、各画面にエラーを戻したいのです。

こういったことはそもそも実現可能なのでしょうか？  
ご存知の方がいらっしゃいましたらアドバイスをお願い致します。
CC BY-SA 3.0
2015-05-12T01:24:28.770
10063
2015-05-27T07:12:25.227
9688
question
java spring
Spring MVCを利用したファイルアップロード時のエラーハンドリング
実現可能です。

まずExceptionHandlerで例外を処理します。このとき画面Aと画面Bでコントローラクラスを分けます。こうすることで、各コントローラで同じ例外に対して異なる処理を実行させることができます。

```

    @Controller
    public class SampleAController {
    
        // 画面Aの処理を記述する
    
        @ExceptionHandler(MaxUploadSizeExceededException.class)
        public ModelAndView handleException(MaxUploadSizeExceededException ex) {
            ModelAndView mav = new ModelAndView("A");
            mav.addObject("message", "message A");
            return mav;
        }
    }
    
    @Controller
    public class SampleBController {
    
        // 画面Bの処理を記述する
    
        @ExceptionHandler(MaxUploadSizeExceededException.class)
        public ModelAndView handleException(MaxUploadSizeExceededException ex) {
            ModelAndView mav = new ModelAndView("B");
            mav.addObject("message", "message B");
            return mav;
        }
    }
    
```

もしグローバルに定義する場合は`@ControllerAdvice`
アノテーションをつけた例外ハンドラクラスを作成しますが、そのとき課題があります。どの画面からのアクセスなのかを判断する方法が、HTTPのリファラしかありません。HttpServletRequestオブジェクトをExceptionHandlerのメソッドの引数に追加し、`httpServletRequest.getHeader("referer");`をしてリファラのURLを取得し、そのURLをもってどの画面からのアクセスかを判断することとなります。

```

    @ControllerAdvice
    @Component
    @Order(0)
    public class SampleControllerAdvice {
    
        @ExceptionHandler(MaxUploadSizeExceededException.class)
        public ModelAndView handleException(MaxUploadSizeExceededException ex,
                HttpServletRequest request) {
            String referer = request.getHeader("referer");
            // 画面Aからきたかを判定する何らかの方法
            if (referer.contains("A") {
                ModelAndView mav = new ModelAndView("A");
                mav.addObject("message", "message A");
                return mav;
            }
            // 画面Bからきたかを判定する何らかの方法
            if (referer.contains("B") {
                ModelAndView mav = new ModelAndView("B");
                mav.addObject("message", "message B");
                return mav;
            }
            return new ModelAndView("default");
        }
    
    }
    
```
CC BY-SA 3.0
2015-05-27T07:12:25.227
10670
2015-05-27T07:12:25.227
4464
10063
answer