5

我已經設置最大文件大小多部分文件的最大尺寸異常 - 春季啓動embbeded tomcat的

multipart.maxFileSize: 1mb 
multipart.maxRequestSize: 1mb 

這是我的控制器:

@RequestMapping(method=RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.MULTIPART_FORM_DATA_VALUE) 
@ResponseStatus(HttpStatus.CREATED) 
@Secured(Privileges.CAN_USER_READ) 
public void create(@RequestParam("file")final MultipartFile file,Principal principal) throws IllegalStateException, IOException,MultipartException{ 

    medicalHistoryService.create(new MedicalHistory(file)); 
} 

這是錯誤信息

2016-03-03 13:48:24.560 WARN 4992 --- [nio-8080-exec-1] h.c.w.RestResponseEntityExceptionHandler : Could not parse multipart servlet request; nested exception is java.lang.IllegalStateException: org.apache.tomcat.util.http.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (9288401) exceeds the configured maximum (1048576) 

2016-03-03 13:48:25.545 WARN 4992 --- [nio-8080-exec-2] h.c.w.RestResponseEntityExceptionHandler : Could not parse multipart servlet request; nested exception is java.lang.IllegalStateException: org.apache.tomcat.util.http.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (9288401) exceeds the configured maximum (1048576) 

超大文件請求後的最終結果是問題加載頁面。我沒有得到任何其他錯誤的堆棧跟蹤,所以我有點卡住了實際發生的事情。噢,我已經嘗試了許多其他解決方案,例如註冊過濾器,在ErrorController中處理異常。每次我都會得到相同的結果 - 服務器崩潰。 Tomcat crash

EDIT 2

我的異常處理類:

@ControllerAdvice 
public class RestResponseEntityExceptionHandler extends 
ResponseEntityExceptionHandler{ 

// 413 MultipartException - file size too big 
@ExceptionHandler({MultipartException.class,FileSizeLimitExceededException.class,java.lang.IllegalStateException.class}) 
public ResponseEntity<Object> handleSizeExceededException(final WebRequest request, final MultipartException ex) { 
    //log.warn("413 Status Code. File size too large {}", ex.getMessage()); 
    log.warn(ex.getMessage()); 
    final ApiError apiError = message(HttpStatus.PAYLOAD_TOO_LARGE, ex); 
    return handleExceptionInternal(ex, apiError, new HttpHeaders(), HttpStatus.PAYLOAD_TOO_LARGE, request); 
} 

}

+0

您未顯示足夠的代碼。例如,'handleExceptionInternal'是做什麼的。一個[最小的,完整的,可驗證的例子](http://stackoverflow.com/help/mcve)將使人們更容易幫助你。 –

+0

'handleExceptionInternal'是'ResponseEntityExceptionHandler'的內部方法,它是通過「希望提供集中式異常處理的{Controller LinkAdvice @ControllerAdvice}類 *的便利基類」。 –

回答

10

這是棘手。 Tomcat屬性MaxSwallowSize導致了這個問題。顯然它是在最近的Tomcat版本中引入的。它背後的全部想法是,如果Tomcat意識到請求將被拒絕,終止高於默認2mb的連接(至少這是我的解釋)。簡單的覆蓋這個屬性修復了一些東西。我意識到這不是完美的解決方案,但它比僅僅終止連接好得多。

@Bean 
public TomcatEmbeddedServletContainerFactory containerFactory() { 
    TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory(); 
    factory.addConnectorCustomizers(new TomcatConnectorCustomizer() { 
     @Override 
     public void customize(Connector connector) { 
     ((AbstractHttp11Protocol<?>) connector.getProtocolHandler()).setMaxSwallowSize(-1); 
     } 
    }); 
    return factory; 
} 
+0

你剛剛在帖子中保存了本質上相同的代碼。我懷疑我會發現答案,如果有的話,沒有很多小時的麻煩,所以謝謝你,謝謝你,謝謝。 –

+1

@TimPerry不客氣。總是樂於幫助:) –

+0

謝謝你,你釘了它,它應該成爲Springboot文檔的一部分。 – lekant

0

我寫application.yml一些行來解決這個問題,如:

spring: 
    http: 
     multipart: 
      max-file-size: 10MB 
      max-request-size: 10MB 

它幫助而我在appl寫道ication.properties但不在yml中。

+0

這篇文章不是回答這個問題的實際嘗試。請注意[Stack Overflow不像討論論壇](http://stackoverflow.com/about),它是一個問答網站,每個帖子都是問題或問題的答案。帖子也可以有[評論](http://stackoverflow.com/help/privileges/comment) - 這樣的小句子 - 可以用來批評或請求作者澄清。這應該是一個評論或[新問題](http://stackoverflow.com/questions/ask)。 –

+0

我編輯刪除您的答案中的問題,因爲答案只能提供答案。您可以將該問題作爲評論或作爲新問題發佈。 –