FileSizeLimitExceededException не может быть обработано при весенней загрузке

Когда я пытаюсь загрузить файл, я получаю исключение FileSizeLimitExceededException и не могу обработать его в своем классе контроллера.

Мой обработчик исключений выглядит следующим образом:

@ExceptionHandler(Exception.class)
    public ModelAndView handleFileSizeLimitExceeded(Exception exc) {
        
        System.out.println("In Exception handler");
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        User user = userService.findUserByEmail(auth.getName());
         ModelAndView modelAndView = new ModelAndView();

        modelAndView.addObject("imageUploadMessage", "File too big");
         modelAndView.addObject("currentUser", user);
 
        modelAndView.setViewName("profile");

        return          modelAndView;
    }

Я видел несколько похожих вопросов на Stackoverflow об этой проблеме, но многие из них не имеют принятого ответа, а предложенные там ответы также не могли решить мою проблему. Например, я пробовал FileSizeLimitExceededException, MultipartException и MaxUploadSizeExceededException в своем обработчике исключений, но контроллер вообще никогда не срабатывал. Следуя решению, предложенному здесь, я попробовал следующие настройки в своем propertis файле:

    spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
server.tomcat.max-swallow-size=100MB
spring.servlet.multipart.resolve-lazily=true

Но тоже без успеха.

Есть ли решение этой проблемы?

А пока я хочу вернуть ModelAndView в качестве оператора return.

Я надеюсь, что кто-то уже нашел реальное решение этой проблемы :).

Обновление 1: Вот скриншот исключения:

Какой размер файла вы тестировали? Если он> 100 МБ, я подозреваю, что Tomcat разорвет соединение, и вы не увидите ответа с ModelAndView.

Andrei Kovrov 13.12.2020 00:13

Кроме того, было бы хорошо, если бы вы предоставили логи и фактический ответ

Andrei Kovrov 13.12.2020 00:17

@AndreiKovrov Файл, который я пытаюсь загрузить, представляет собой изображение размером 16 МБ. Я обновил свой вопрос со скриншотом исключения.

user1419243 13.12.2020 08:47
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
383
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Определите другой класс для глобальной обработки MaxUploadSizeExceededException. Код ниже запускается только при возникновении исключения MaxUploadSizeExceededException.

@ControllerAdvice
public class GlobalControllerAdvice {

    @ExceptionHandler(MaxUploadSizeExceededException.class)
    public ModelAndView handleFileSizeLimitExceeded(HttpServletRequest req, Exception ex) {
        System.out.println("In Exception handler");
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        User user = userService.findUserByEmail(auth.getName());
        ModelAndView modelAndView = new ModelAndView();

        modelAndView.addObject("imageUploadMessage", "File too big");
        modelAndView.addObject("currentUser", user);

        modelAndView.setViewName("profile");

        return          modelAndView;
    }
}

К сожалению, ваш код не работает. Я его как-то поменял и вроде стало лучше. Но единственная разница в том, что я не получаю никаких ошибок в выводе моего затмения. Но он НЕ возвращается на текущую страницу и не показывает сообщение, которое я установил в modelAndView.

user1419243 13.12.2020 14:53

привет, я протестировал код с ответом ResponseEntity. Я видел, что точка останова находится в функции. Вы пытались поставить какие-либо точки останова в функции?

Ismail Durmaz 13.12.2020 15:20

Я также запустил функцию при реализации с использованием ControllerAdvice, и если я установил там точку останова, я также это вижу. Ты прав. Но похоже, что возврат "ModelAndView" там не работает должным образом. Меня не перенаправляют на страницу, на которой я был раньше. Когда я реализую это таким образом, я не получаю никаких исключений в своем затмении и не возвращаюсь на предыдущую страницу, а просто вижу страницу «соединение прервано».

user1419243 13.12.2020 15:35

Если вы можете вернуть код на текущую страницу, не могли бы вы поделиться своим кодом со мной.

user1419243 13.12.2020 15:36
Ответ принят как подходящий

Чтобы решить мою проблему, мне просто нужно было обновить версию Spring в моем pom.xml файле.

Другие вопросы по теме