2017-10-12 20 views
1

我使用Spring引導1.5.7。
我還沒有配置CommonsMultipartResolver,因爲Spring Boot已經處理文件上傳。Spring引導句柄SizeLimitExceededException

如果我的上傳超過了最大的permited大小,就會拋出一個醜陋的異常。
這是由我的控制器處理。

@ControllerAdvice 
public abstract class DefaultController implements InitializingBean { 
    @ExceptionHandler(Exception.class) 
    public ResponseEntity<ServiceException> handleException(final Exception ex) { 
     ... 
     } else if (ex instanceof MultipartException) { 
      MultipartException me = (MultipartException) ex; 
      Throwable cause = ex.getCause(); 
      if (cause instanceof IllegalStateException) { 
       Throwable cause2 = cause.getCause(); 
       if (cause2 instanceof SizeLimitExceededException) { 
        // this is tomcat specific 
        SizeLimitExceededException slee = (SizeLimitExceededException) cause2; 
       } 
      } 
     } 

這種處理不僅複雜,而且可悲的是特定於Tomcat,因爲SizeLimitExceededException在包org.apache.tomcat.util.http.fileupload.FileUploadBase

我該如何處理錯誤案例,有人上傳了一個較大的文件,然後允許並返回一條好消息,而不管使用哪個Servlet引擎?

回答

2

您可以在您的@ControllerAdvice中定義異常處理程序方法,該方法專用於MultipartException,然後使用特定的HttpStatus對其進行限定。例如:

@ExceptionHandler(MultipartException.class) 
@ResponseStatus(value = HttpStatus.PAYLOAD_TOO_LARGE) 
public ResponseEntity<ServiceException> handleMultipartException(MultipartException ex) { 
    ... 
} 

這應該允許您關注「最大文件大小」異常,而無需進入servlet容器細節。

更新1迴應此評論:

聽起來不錯,那getPermittedSize和getActualSize由SizeLimitExceededException提供的是有機會得到這個值不是隻有在使用Tomcat的?

通過根據(a)異常類型和(b)HTTP狀態攔截此錯誤...您正在使解決方案通常適用。但是這樣做可能會失去一種servlet容器(但也許不是另一種)可能會給你的詳細信息。您也許可以通過設置spring.http.multipart.max-file-size來強制您自己的最大尺寸,在這種情況下您可以報告「允許的尺寸」,但是如果您想報告「實際尺寸」,則必須考慮以下其中一項:

  • 不得不使用由servlet容器
  • 提供一些選擇spring.http.multipart.max-file-size是少腋臭支持最大爲你的servlet容器,然後運用你的控制器內自己的最大尺寸檢查,並拋出包含實際自己特定的異常類型和允許的尺寸。
+0

聽起來不錯,那麼SizeLimitExceededException提供的getPermittedSize和getActualSize有沒有機會在使用Tomcat的情況下獲取此值? – Nabor

+0

@Nabor:我已經更新了答案以解決您的最新評論 – glytching

+0

我將繼續使用當前的Tomcat特定解決方案,但答案很好。 – Nabor