2012-03-28 51 views
14

Tôi có bộ điều khiển MVC Spring với một số yêu cầu dịch vụ REST đơn giản. Tôi muốn thêm một số lỗi xử lý khi ngoại lệ cụ thể được ném từ các dịch vụ của tôi, nhưng tôi không thể có được một phương thức xử lý được chú thích bằng @ExceptionHandler để thực sự được gọi. Đây là một dịch vụ tôi cố ý ném một ngoại lệ để thử và nhận phương pháp xử lý của tôi để tiếp quản. Phương thức xử lý không bao giờ được gọi và Spring chỉ trả về lỗi 500 cho trình khách gọi. Bạn có bất kỳ ý tưởng về những gì tôi đang làm sai?Phương pháp Spring MVC @ExceptionHandler trong bộ điều khiển không bao giờ được gọi

@ExceptionHandler(IOException.class) 
public ModelAndView handleIOException(IOException ex, HttpServletRequest request, HttpServletResponse response) { 
    response.sendError(HttpServletResponse.SC_FORBIDDEN); 
    System.out.println("It worked!"); 
    return new ModelAndView(); 
} 

@RequestMapping(value = "/json/remove-service/{id}", method = RequestMethod.DELETE) 
public void remove(@PathVariable("id") Long id) throws IOException { 
    throw new IOException("The handler should take over from here!"); 
} 

Trả lời

13

Điều này tip on the Spring forum có thể giúp bạn.

có khả năng bạn đã cấu hình hạt cà phê cho DispatchServlet của bạn trong một tập tin webmvc-servlet.xml (tập tin * -servlet.xml thể được đặt tên khác nhau)

Nếu file XML đã bao gồm một ExceptionResolver (như SimpleMappingExceptionResovler mùa xuân wont tự động thêm bất kỳ phân giải khác cho bạn vì vậy, tay thêm resolver chú thích như sau:..

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver" /> 

nên cho phép xử lý @HandlerException

+3

'AnnotationMethodHandlerExceptionResolver' hiện không được chấp nhận nên điều này không giúp ích trong các phiên bản Spring mới hơn. –

+0

Sử dụng bean này với thuộc tính 'p: order' được đặt ở mức ưu tiên cao nhất (1) được quản lý để khắc phục sự cố của tôi. – Alex

+0

@MattFriedman Chỉ cần thay thế 'AnnotationMethodHandlerExceptionResolver' bằng 'org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver' đã làm việc cho tôi –

0

Nó sẽ không hoạt động, vì khi bạn trả về chuỗi, bạn trả về tên View.

Bây giờ bộ điều khiển MVC Spring của bạn đang tìm kiếm Phương pháp này không bao giờ được gọi! Tại sao không?! xem và có thể tìm thấy.

Đảm bảo rằng @ExceptionHandler được ánh xạ tới chế độ xem hiện tại.

+0

Điều đó rất có khả năng sẽ dẫn đến 404, không phải là 500. – skaffman

+1

Xin lỗi, vấn đề là phương pháp không bao giờ được gọi, vì vậy những gì được trả về là không liên quan. Tôi đã thay đổi những gì đang được trả lại. – 11101101b

12

Bực bội, tôi cũng phải chịu đựng điều này. Tôi phát hiện ra rằng nếu bạn triển khai sai số Throwable thay vì Exception Trình phân giải ngoại lệ sẽ chỉ tính lại Throwable của bạn là IllegalStateException. Điều này sẽ không gọi số @ExceptionHandler của bạn.

Nếu bạn đã triển khai Throwable thay vì Exception, hãy thử thay đổi thành Exception để thay thế.

Dưới đây là mã trong câu hỏi từ InvocableHandlerMethod

catch (InvocationTargetException e) { 
      // Unwrap for HandlerExceptionResolvers ... 
      Throwable targetException = e.getTargetException(); 
      if (targetException instanceof RuntimeException) { 
       throw (RuntimeException) targetException; 
      } 
      else if (targetException instanceof Error) { 
       throw (Error) targetException; 
      } 
      else if (targetException instanceof Exception) { 
       throw (Exception) targetException; 
      } 
      else { 
       String msg = getInvocationErrorMessage("Failed to invoke controller method", args); 
       throw new IllegalStateException(msg, targetException); 
      } 
     } 
4

Tôi đã phát hiện ra rằng @ExceptionHandler làm việc với Throwable khi bạn xác định phương pháp theo cách như vậy:

@ExceptionHandler(Throwable.class) 
@ResponseBody 
public String handleException(Throwable e) { 

} 

Trong phương pháp trường hợp này chỉ có một đối số của loại Throwable. Nếu tôi cố gắng sử dụng trong phương pháp này một số tham số bổ sung (tôi đã cố gắng sử dụng Model), tôi nhận được 500 ngoại lệ (phương thức này không gọi). Tuy nhiên điều này vẫn hoạt động khi các tham số bổ sung là HttpServlerRequest hoặc HttpServlerResponse.

Các vấn đề liên quan