0

Please excuse any horrible mistakes, I literally picked up Kotlin fully and some Spring about a week ago, due to a project requirement. I am trying to create a simple RESTful API with an endpoint that can accept a file via Multipart. Later on, there will be a few pages outside the API that will display HTML, I am using Koreander for that. From what I can see, and based on Java tutorials, exception handling should work like this.

For the API, my defined exception handler for MaxUploadSizeExceededException, however, does not fire at all. My application.kt:

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

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

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

My controller:

@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.")
    }
}

When I am attempting to post a large file via curl, I get a JSON reply:

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"}

Is it possible that Tomcat does not pass this exception to Spring? If yes, how may I go about catching this? It also works if I can set the size to unlimited and check for file size at upload time, though I would need to do that before the server starts receiving the file, and I assume by the time I get to the /api/convert endpoint, it is too late.

Thanks for any help.

Erion
  • 33
  • 1
  • 6

1 Answers1

1

Found the issue. I'm posting it for anyone else who might have the same issue in the future.

@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)
    }
}
Erion
  • 33
  • 1
  • 6