5

Mam ustawiony maksymalny rozmiar pliku doMultipart plik maksymalny rozmiar wyjątek - wiosna bagażnika embbeded kocur

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

To jest mój kontroler:

@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)); 
} 

jest komunikat o błędzie

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) 

Ostatnim wynikiem po przesłaniu prośby o zbyt duży plik jest strona ładowania problemów. Nie dostaję żadnego innego błędu w śladzie stosu, więc trochę utknąłem z tym, co się dzieje. O tak, próbowałem wielu innych rozwiązań, takich jak rejestrowanie filtra, obsługa wyjątków w ErrorController. Za każdym razem kończy się to samym wynikiem - awaria serwera. Tomcat crash

EDIT 2

My wyjątkiem klasy Postępowanie:

@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

Nie pokazałeś wystarczającej ilości kodu. Na przykład czym jest 'handleExceptionInternal'. [Minimalny, kompletny, weryfikowalny przykład] (http://stackoverflow.com/help/mcve) ułatwi ci pomoc. –

+0

'handleExceptionInternal' jest wewnętrzną metodą 'ResponseEntityExceptionHandler', która jest, według dokumentacji" Wygodna klasa bazowa dla {@link ControllerAdvice @ControllerAdvice} klas *, które chcą zapewnić scentralizowaną obsługę wyjątków ". –

Odpowiedz

10

To trudne. Przyczyną tego problemu była właściwość Tomcat MaxSwallowSize. Najwyraźniej został wprowadzony w jednej z ostatnich wersji Tomcat. Cała idea kryła się za tym, jeśli Tomcat zdał sobie sprawę, że żądanie zostanie odrzucone, aby zakończyć połączenie z czymkolwiek wyższym niż domyślne 2 MB (przynajmniej taka była moja interpretacja). Proste przesłonięcie tej właściwości naprawia pewne rzeczy. Rozumiem, że to nie jest doskonałe rozwiązanie, ale jest o wiele lepsze niż kończenie połączenia.

@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

Właśnie uratowałeś mnie przed opublikowaniem zasadniczo tego samego kodu w pytaniu. Wątpię, czy odkryłbym odpowiedź, jeśli kiedykolwiek, bez wielu godzin kłopotów, więc dziękuję, dziękuję, dziękuję. –

+1

@TimPerry Nie ma za co. Zawsze chętnie pomożemy :) –

+0

Dziękuję człowieku, przybijałeś go, będzie on częścią dokumentacji Springboot. – lekant

0

napisałem kilka wierszy w application.yml aby rozwiązać ten problem następująco:

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

Pomogło podczas gdy ja pisałem w aplikacji ication.properties, ale nie w yml.

+0

Ten wpis nie jest faktyczną próbą odpowiedzi na pytanie.Uwaga: [Przekierowanie stosu nie działa jak forum dyskusyjne] (http://stackoverflow.com/about), to strona z pytaniami i odpowiedziami, gdzie każdy post jest albo pytaniem, albo odpowiedzią na pytanie. Posty mogą mieć również [comments] (http://stackoverflow.com/help/privileges/comment) - małe zdania, takie jak ten - które mogą być użyte do krytyki lub prośby o wyjaśnienia od autora. Powinien to być komentarz lub [nowe pytanie] (http://stackoverflow.com/questions/ask). –

+0

Edytowałem, aby usunąć pytanie w Twojej odpowiedzi, ponieważ odpowiedzi mają tylko dostarczyć odpowiedzi. Możesz dodać to pytanie jako komentarz lub jako nowe pytanie. –