Я использую Spring 3.2.0. В соответствии с ответом this у меня есть тот же метод в моем аннотированном контроллере, который реализует интерфейс HandlerExceptionResolver
, такой как
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception exception) {
Map<String, Object> model = new HashMap<String, Object>(0);
if (exception instanceof MaxUploadSizeExceededException) {
model.put("msg", exception.toString());
model.put("status", "-1");
} else {
model.put("msg", "Unexpected error : " + exception.toString());
model.put("status", "-1");
}
return new ModelAndView("admin_side/ProductImage");
}
и конфигурация Spring включает в себя
<bean id="filterMultipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize">
<value>10000</value>
</property>
</bean>
При превышении размера файла необходимо вызвать предыдущий метод, и он должен автоматически обрабатывать исключение, но этого не происходит вообще. Метод resolveException()
никогда не вызывается, даже если это исключение. Каков способ справиться с этим исключением? Я что-то пропустил?
То же самое также указано здесь. Я не уверен, почему это не работает в моем случае.
Я попробовал следующий подход с @ControllerAdvice
но это тоже не сработало.
package exceptionhandler;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.multipart.MaxUploadSizeExceededException;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
@ControllerAdvice
public final class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(value = {MaxUploadSizeExceededException.class})
protected ResponseEntity<Object> handleConflict(RuntimeException ex, WebRequest request) {
String bodyOfResponse = "This should be application specific";
return handleExceptionInternal(ex, bodyOfResponse, new HttpHeaders(), HttpStatus.CONFLICT, request);
}
}
Я также попытался поставить подробный - Exception
.
@ExceptionHandler(value={Exception.class})
Метод ResponseEntity()
никогда не вызывается в любом случае.
В общем, я хочу обработать это исключение на базе контроллера (уровень контроллера), если это возможно. Для этого один аннотированный метод @ExceptionHandler
должен быть активен только для этого конкретного контроллера, но не для всего приложения для всего приложения, так как в моем приложении есть только несколько веб-страниц, которые обрабатывают загрузку файлов. Когда это исключение вызвано, я просто хочу показать удобное для пользователя сообщение об ошибке на текущей странице и не перенаправлять на страницу с ошибкой, настроенную в файле web.xml
. Если это даже невозможно, то это исключение должно обрабатываться в любом случае без каких-либо особых требований, которые я только что выразил.
Ни один из подходов не работал у меня. Я ничего не могу узнать об обработке этого исключения. Требуется ли дополнительная настройка где-либо в файлах XML или иначе?
То, что я получаю после того, как выбрано исключение, можно увидеть в следующем snap shot.