2012-07-18 14 views
6

Phụ huynh:Tôi có một lớp cha với một @ExceptionHandler và một lớp con với phiên bản riêng của nó. Tôi nhận được một phương pháp lỗi mơ hồ

@ExceptionHandler(NoUserException.class) 
protected ModelAndView handleException(NoUserException e) { 
    Map<String, Object> model = new HashMap<String, Object>(); 

    model.put(ModelKeys.HOST_KEY, "message"); 

    return new ModelAndView("noAccess",model); 
} 

Đứa trẻ:

@ExceptionHandler(NoUserException.class) 
protected void handleException(NoUserException e, HttpServletRequest request, HttpServletResponse response) throws IOException { 
    logger.error("Invalid user."); 
    respond(CLIENT_USER_ERROR,response); 
} 

Có, tôi cần họ có thông số và kết quả đầu ra khác nhau.

+0

ý của bạn là gì? Đó là một số mã trong lớp cha mẹ ... nó chỉ là một ném đơn giản NoUserException mới() –

+0

nó không phải là? nó xảy ra khi tôi chạy nó. nó không thể quyết định phương pháp để sử dụng. –

+0

Có lẽ vì có hai '@ ExceptionHandler' được định nghĩa, một thừa kế từ lớp cha và lớp mới được định nghĩa trong lớp con. Không chắc chắn làm thế nào để ghi đè lên nó, nó sẽ không xảy ra tự động vì các phương thức không có chữ ký giống nhau. – purtip31

Trả lời

8

Bạn không thể có hai phương pháp với cùng một trình xử lý ngoại lệ, xin lỗi, nó không được hỗ trợ. Mã giải quyết chúng không phân biệt giữa các siêu lớp con và xem xét phân lớp "cụ thể hơn". Mã này nằm trong số org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver nếu bạn quan tâm. Nó sẽ không khó để thực hiện của riêng bạn thực hiện của AbstractHandlerExceptionResolver dựa trên một trong đó không xem xét một phương pháp trực tiếp trên bộ điều khiển một kết quả cụ thể hơn so với một phương pháp kế thừa.

chỉnh sửa: nhận xét cá nhân, tôi đã tìm thấy theo thời gian tốt hơn cho tôi để ngăn chặn sự thôi thúc sử dụng "kế thừa làm công cụ templating" khi tạo bộ điều khiển hướng chú thích của Spring MVC. Xem mã vốn đã clunky và thủ tục ở lần, đây là lý do tại sao chúng tôi thực hiện một "lớp xem" riêng biệt ở nơi đầu tiên. Cách tiếp cận quá vi mô đối với DRY và "sử dụng lại" không có ích cho bạn tại đây. Nếu nó vi phạm Nguyên tắc Thay thế Liskov, tôi không làm điều đó. YMMV tất nhiên.

1

Tại sao không chỉ ủy nhiệm việc triển khai handleException() cho một phương pháp khác?

// superclass 
protected ModelAndView handleExceptionImpl(
     NoUserException e, 
     HttpServletResponse response) { 
    Map<String, Object> model = new HashMap<String, Object>(); 
    model.put(ModelKeys.HOST_KEY, "message"); 
    return new ModelAndView("noAccess",model); 
} 

@ExceptionHandler(NoUserException.class) 
protected ModelAndView handleException(
     NoUserException e, 
     HttpServletResponse response) { 
    return handleExceptionImpl(e, response); 
} 

// subclass 
@Override 
protected ModelAndView handleExceptionImpl(
     NoUserException e, 
     HttpServletResponse response) { 
    logger.error("Invalid user."); 
    respond(CLIENT_USER_ERROR,response); 
} 
Các vấn đề liên quan