SpringBoot / Kotlin: не запускается обработчик Multipart MaxUploadSizeExceededException - PullRequest
0 голосов
/ 27 ноября 2018

Пожалуйста, извините за любые ужасные ошибки, я буквально подобрал Kotlin полностью и немного весны около недели назад, из-за требования проекта.Я пытаюсь создать простой RESTful API с конечной точкой, которая может принимать файл через Multipart.Позже за пределами API появятся несколько страниц, которые будут отображать HTML, для этого я использую Koreander .Из того, что я вижу, и на основе учебных пособий по Java обработка исключений должна работать следующим образом.

Для API мой определенный обработчик исключений для MaxUploadSizeExceededException, однако, не срабатывает вообще.My application.kt:

@SpringBootApplication
@EnableConfigurationProperties(StorageProperties::class)
class JaApplication {

    @Bean fun koreanderViewResolver(): ViewResolver = KoreanderViewResolver()
}

fun main(args: Array<String>) {
    runApplication<JaApplication>(*args)
}

Мой контроллер:

@RestController
@RequestMapping("/api")
@EnableAutoConfiguration
class APIController {

    @PostMapping(
        value = "/convert",
        produces = arrayOf(MediaType.APPLICATION_JSON_VALUE)
    )
    fun convert(@RequestParam("file") multipartFile: MultipartFile): Result {
        return Result(status = 0, message = "You have uploaded: ${multipartFile.getOriginalFilename()}.")
    }
}

@ControllerAdvice
class ExceptionHandlers {

    @ExceptionHandler(MultipartException::class)
    fun handleException(e: MultipartException): String = Result(status = 1, message = "File is too large.")
    }
}

Когда я пытаюсь опубликовать большой файл с помощью curl, я получаю JSON-ответ:

curl -F 'file=@path-to-large-file' http://localhost:8080/api/convert

{"timestamp":"2018-11-27T15:47:31.907+0000","status":500,"error":"Internal Serve
r Error","message":"Maximum upload size exceeded; nested exception is java.lang.
IllegalStateException: org.apache.tomcat.util.http.fileupload.FileUploadBase$Siz
eLimitExceededException: the request was rejected because its size (4294967496)
exceeds the configured maximum (529530880)","path":"/api/convert"}

Возможно ли, что Tomcat не передаст это исключение в Spring?Если да, как я могу поймать это?Это также работает, если я могу установить неограниченный размер и проверить размер файла во время загрузки, хотя мне нужно было бы сделать это до того, как сервер начнет получать файл, и я предполагаю, что к тому времени, когда я доберусь до / api/ convert endpoint, уже слишком поздно.

Спасибо за любую помощь.

1 Ответ

0 голосов
/ 28 ноября 2018

Нашел проблему.Я публикую его для всех, у кого в будущем может возникнуть такая же проблема.

@ControllerAdvice
class ExceptionHandlers():ResponseEntityExceptionHandler() {

    @ExceptionHandler(MaxUploadSizeExceededException::class)
    fun handleException(e: MultipartException, request:WebRequest): ResponseEntity<Any> {
        return handleExceptionInternal(e, Result(message = "File is too large."), HttpHeaders(), HttpStatus.PAYLOAD_TOO_LARGE, request)
    }
}
...