3

Spring MVCを使用して、フォームでアップロードされているファイルを受信して​​います。これは、リクエストを受け取り、発生する可能性のある例外を処理するコントローラーです。

@RequestMapping(method = RequestMethod.POST, 
                headers = {"content-type=multipart/form-data"}, 
                produces = "application/xml")
public @ResponseBody MyStuff processFormUpload( @RequestParam("file") CommonsMultipartFile file) throws 
    //return beautiful xml response generated from the input file;
}

@ExceptionHandler(Exception.class)
public ModelAndView exceptionHandler(Exception ex, HttpServletResponse response) {
    //return pretty exception page;
}

これは、ファイル リゾルバーを初期化する方法です。

<bean id="multipartResolver"
      class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="maxUploadSize" value="100000"/>
</bean>

応答の生成中に例外が発生した場合でも、すべてが美しく機能します。唯一の問題は、誰かがmaxUploadSizeより大きいファイルをアップロードしようとした場合です。この場合、exceptionHandler は例外をキャッチせず、サービスは醜い内部エラー 500を返しますMaxUploadSizeExceededException

その種の例外もキャッチするように Web アプリを構成するにはどうすればよいですか? @ExceptionHandlersプロジェクト構造をあまり変更せずに使いたいです。

4

1 に答える 1

1

私の理解では、これらの例外はデータ バインディング中にスローされ、コントローラーに実際に到達する前にスローされるため、500 が発生し、例外ハンドラー メソッドが呼び出されません。

これまでのところ、あなたが言及したことを処理するために私が見つけた唯一の方法は、コントローラーが「HandlerExceptionResolver」を実装し、次の実装を提供することです。

    public ModelAndView resolveException(HttpServletRequest request,
        HttpServletResponse response, Object handler, Exception exception)

@ExceptionHandler としてエレガントまたは柔軟に見えないことに同意します。お役に立てれば。

于 2013-02-11T21:37:54.240 に答える