5

Ich habe maximale Dateigröße zuMehrteiliger Datei Ausnahme maximale Größe - Federverschluß embbeded tomcat

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

Dies ist mein Controller:

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

diese Fehlermeldung

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) 

Und das Endergebnis nach der Anfrage mit der übergroßen Datei ist die Seite zum Laden des Problems. Ich bekomme keinen anderen Fehler in der Stack-Trace, also bin ich irgendwie mit dem fest, was eigentlich vor sich geht. Oh ja, ich habe viele andere Lösungen ausprobiert, wie zum Beispiel das Registrieren von Filtern und das Behandeln von Ausnahmen in ErrorController. Jedes Mal, wenn ich mit dem gleichen Ergebnis enden würde - Server-Crash. Tomcat crash

EDIT 2

Meine Ausnahmebehandlung Klasse:

@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

Sie haben nicht genug von Ihrem Code gezeigt. Was macht 'handleExceptionInternal' zum Beispiel. Ein [minimales, vollständiges, überprüfbares Beispiel] (http://stackoverflow.com/help/mcve) wird es den Menschen erleichtern, Ihnen zu helfen. –

+0

'handleExceptionInternal' ist eine interne Methode von 'ResponseEntityExceptionHandler', die in der Dokumentation" Eine praktische Basisklasse für {@link ControllerAdvice @ControllerAdvice} Klassen * ist, die eine zentrale Ausnahmebehandlung bereitstellen möchten ". –

Antwort

10

Das war schwierig. Die Tomcat-Eigenschaft MaxSwallowSize verursachte dieses Problem. Offenbar wurde es in einer der letzten Versionen von Tomcat eingeführt. Die ganze Idee dahinter war, wenn Tomcat erkannte, dass die Anfrage abgelehnt wurde, um die Verbindung etwas höher als Standard 2 MB zu beenden (zumindest war dies meine Interpretation). Einfaches Überschreiben dieser Eigenschaft behebt die Dinge. Ich weiß, dass dies keine perfekte Lösung ist, aber es ist viel besser als nur die Verbindung zu beenden.

@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

Sie haben mich gerade daran gehindert, im Wesentlichen denselben Code in der Frage zu posten. Ich bezweifle, dass ich die Antwort gefunden hätte, wenn überhaupt, ohne viele Stunden Ärger, also danke, danke, danke. –

+1

@TimPerry Gern geschehen. Immer glücklich zu helfen :) –

+0

Danke Mann, du hast es genagelt, es sollte Teil der Springboot-Dokumentation sein. – lekant

0

ich ein paar Zeilen in application.yml schrieb wie dieses Problem zu lösen:

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

Es half während ich in Appl ication.properties, aber nicht in Yml.

+0

Dieser Beitrag ist kein tatsächlicher Versuch, die Frage zu beantworten.Bitte beachten Sie, [Stack Overflow funktioniert nicht wie ein Diskussionsforum] (http://stackoverflow.com/about), es ist eine Q & A-Site, bei der jeder Post entweder eine Frage oder eine Antwort auf eine Frage ist. Beiträge können auch [Kommentare] (http://stackoverflow.com/help/privileges/comment) - kleine Sätze wie diesen - haben, die verwendet werden können, um einen Autor zu kritisieren oder um Klärung zu bitten. Dies sollte entweder ein Kommentar oder eine [neue Frage] sein (http://stackoverflow.com/questions/ask). –

+0

Ich bearbeitet, um die Frage in Ihrer Antwort zu entfernen, da Antworten nur Antworten geben sollen. Sie können diese Frage als Kommentar oder als neue Frage stellen. –