Tôi đang sử dụng Spring 3.2.0. Theo this câu trả lời, tôi có cùng một phương pháp trong điều khiển chú thích của tôi mà thực hiện giao diện HandlerExceptionResolver
như,MaxUploadSizeExceededException không gọi phương thức xử lý ngoại lệ trong Spring
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");
}
và cấu hình Spring bao gồm,
<bean id="filterMultipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize">
<value>10000</value>
</property>
</bean>
Khi kích thước tập tin lớn hơn, trước đó phương thức nên được gọi và nó sẽ tự động xử lý ngoại lệ nhưng nó không xảy ra chút nào. Phương thức resolveException()
không bao giờ được gọi ngay cả khi ngoại lệ xảy ra. Cách xử lý ngoại lệ này là gì? Tui bỏ lỡ điều gì vậy?
Điều tương tự cũng được chỉ định here. Tôi không chắc tại sao nó không hoạt động trong trường hợp của tôi.
Tôi đã thử following approach với @ControllerAdvice
nhưng không hoạt động.
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);
}
}
Tôi cũng đã cố gắng đặt chi tiết - Exception
.
@ExceptionHandler(value={Exception.class})
Phương pháp ResponseEntity()
không bao giờ được gọi trong mọi trường hợp.
Nói chung, tôi muốn xử lý ngoại lệ này cho mỗi cơ sở điều khiển (cấp bộ điều khiển), nếu có thể. Đối với điều này, một phương thức chú thích @ExceptionHandler
chỉ nên hoạt động cho bộ điều khiển cụ thể đó, không phải trên toàn cầu cho toàn bộ ứng dụng, vì chỉ có một vài trang web trong ứng dụng của tôi xử lý việc tải lên tệp. Khi ngoại lệ này được gây ra, tôi chỉ muốn hiển thị thông báo lỗi thân thiện với người dùng trên trang hiện tại và không chuyển hướng đến trang lỗi được định cấu hình trong tệp web.xml
. Nếu điều này thậm chí không khả thi, thì ngoại lệ này nên được xử lý mà không cần bất kỳ yêu cầu tùy chỉnh nào mà tôi vừa trình bày.
Không có cách tiếp cận nào phù hợp với tôi. Không có gì thêm về xử lý ngoại lệ này tôi có thể tìm thấy. Nó có yêu cầu cấu hình bổ sung ở đâu đó trong các tệp XML hay không?
Những gì tôi nhận được sau khi ngoại lệ được ném có thể hiển thị trong snap shot sau đây.
Không rõ nếu bạn đã thử điều đó, nhưng '@ ExceptionHandler' chỉ bắt ngoại lệ được ném từ Bộ điều khiển được xác định trong, chứ không phải trên toàn cầu (ví dụ: * "Tôi muốn xử lý ngoại lệ này cho mỗi bộ điều khiển" * về cơ bản là tùy chọn duy nhất) – kryger
@ kryger: Phương thức được chú thích bằng '@ ExceptionHandler' không bao giờ được gọi trong bất kỳ trường hợp nào, không ở cấp điều khiển. Nó được gọi với các ngoại lệ khác nhưng không phải với 'MaxUploadSizeExceededException'. – Tiny
bạn đã giải quyết vấn đề này chưa? – tibi