2014-06-21 23 views
8

Tôi mới đến mùa xuân. Tôi đang phát triển một api REST với webmvc mùa xuân. Để xử lý lỗi, tôi nhận được liên kết này http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc-ann-rest-spring-mvc-exceptionsResponseEntityExceptionHandler không được gọi khi ngoại lệ xảy ra

Tôi đã cố gắng sử dụng ResponseEntityExceptionHandler trong dự án của mình. nhưng bất cứ khi nào điều khiển của tôi ném ngoại lệ nó không bao giờ đạt đến ResponseEntityExceptionHandler này.

Sau đây là đoạn mã của tôi

khiển

@Controller 
@RequestMapping("/hello") 
public class HelloController { 
    private static final Logger logger = Logger.getLogger(HelloController.class); 
    @RequestMapping(value="/{name}", method=RequestMethod.GET) 
    public @ResponseBody String greet(@PathVariable(value = "name")String name) throws InvalidInputException, ResourceNotFoundException{ 
     logger.info("start greet() "+name); 
     System.out.println("start greet() "+name); 
     String message = null; 
     if("".equalsIgnoreCase(name)) 
     { 
      throw new InvalidInputException("Invalid Input"); 
     } 
     List<String> names = new ArrayList<String>(); 
     names.add("Harshal"); 
     names.add("Smitesh"); 
     if(names.contains(name)){ 
      message = "Hello "+ name; 
     }else{ 
      throw new ResourceNotFoundException("Requested Resource not found"); 
     } 
     System.out.println("end greet"); 
     logger.info("end greet()"); 
     return message; 
    } 
} 

Exceptions

package com.practice.errorhandlerdemo.exception; 

public class InvalidInputException extends RuntimeException{ 
    private static final long serialVersionUID = 5489516240608806490L; 
    public InvalidInputException() { 
     super("Invalid Input"); 
    } 
    public InvalidInputException(String message) { 
     super(message); 
    } 
} 

package com.practice.errorhandlerdemo.exception; 

public class ResourceNotFoundException extends RuntimeException { 
    private static final long serialVersionUID = -4041009155673754859L; 
    public ResourceNotFoundException() { 
     super("requested resource not found"); 
    } 
    public ResourceNotFoundException(String message) { 
     super(message); 
    } 
} 

exceptionhandler

@ControllerAdvice 
public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler { 
    private static final Logger logger = Logger.getLogger(RestResponseEntityExceptionHandler.class); 
    @ExceptionHandler(value={ResourceNotFoundException.class}) 
    @ResponseStatus(value=HttpStatus.NOT_FOUND) 
    protected ResponseEntity<Object> handleResourceNotFound(RuntimeException ex, WebRequest request){ 
     logger.info("start handleResourceNotFound()"); 
     String bodyOfResponse = "Requested resource does not found"; 
     HttpHeaders httpHeaders = new HttpHeaders(); 
     httpHeaders.setContentType(MediaType.APPLICATION_JSON); 
     return handleExceptionInternal(ex, bodyOfResponse, httpHeaders, HttpStatus.NOT_FOUND, request); 
    } 

    @ExceptionHandler(value={InvalidInputException.class}) 
    @ResponseStatus(value=HttpStatus.BAD_REQUEST) 
    protected ResponseEntity<Object> handleInvalidInput(RuntimeException ex, WebRequest request){ 
     logger.info("start handleInvalidInput()"); 
     String bodyOfResponse = "Invalid Input"; 
     HttpHeaders httpHeaders = new HttpHeaders(); 
     httpHeaders.setContentType(MediaType.APPLICATION_JSON); 
     return handleExceptionInternal(ex, bodyOfResponse, httpHeaders, HttpStatus.BAD_REQUEST, request); 
    } 
} 

phối servlet

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:context="http://www.springframework.org/schema/context" 
xmlns:p="http://www.springframework.org/schema/p" 
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> 

    <context:component-scan base-package="com.practice.errorhandlerdemo.controller"/> 
    <context:annotation-config/> 

</beans> 

web.xml

<web-app> 
    <display-name>ErrorHandlerDemo</display-name> 
    <servlet> 
     <servlet-name>dispatcher</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value>/WEB-INF/my-servlet.xml</param-value> 
     </init-param> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>dispatcher</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 
</web-app> 
+0

Bạn đã bao giờ tìm thấy giải pháp cho vấn đề của mình chưa? – woemler

+0

Tôi gặp vấn đề tương tự ... –

+0

Tôi nghĩ rằng các phương thức của bạn trong RestResponseEntityExceptionHandler sẽ chỉ được sử dụng nếu chúng ghi đè các phương thức từ ResponseEntityExceptionHandler. –

Trả lời

3

Bạn không cần phải mở rộng ResponseEntityExceptionHandler nếu bạn không cần tất cả các ánh xạ ngoại lệ nó cung cấp.

Một cách đơn giản để viết xử lý ngoại lệ của bạn:

@ControllerAdvice 
public class RestResponseEntityExceptionHandler { 

    @ExceptionHandler(ResourceNotFoundException.class) 
    protected ResponseEntity<String> handleResourceNotFound(ResourceNotFoundException ex){ 

     return ResponseEntity 
       .status(HttpStatus.NOT_FOUND) 
       .body("Requested resource does not found"); 
    } 

    @ExceptionHandler(InvalidInputException.class) 
    protected ResponseEntity<String> handleInvalidInput(InvalidInputException ex){ 

     return ResponseEntity 
       .badRequest() 
       .body("Invalid Input"); 
    } 
} 

Lưu ý rằng API ResponseEntity xây dựng đã được giới thiệu vào mùa xuân 4.1, nhưng bạn có thể sử dụng các nhà xây dựng thường xuyên trên 4.0.x.

+0

Tại sao bất cứ ai downvote câu trả lời này mà không có một lời giải thích? 'ResponseEntityExceptionHandler' không mang thêm các trình xử lý nhưng bạn không nhất thiết phải mở rộng nó. Điều quan trọng là phải có '@ ControllerAdvice' và viết các phương thức chú thích' @ ExceptionHandler' của riêng bạn. – amertkara

+0

Tôi downvoted nó vì câu hỏi là làm thế nào để có được ResponseEntityExceptionHandler làm việc, không phải tôi cần một trong những nơi đầu tiên. 'Nếu' trong câu trả lời này, cho thấy nó là sai và không nên ở đây – dezzer10

+0

Điều gì về ngoại lệ bảo mật? –

1

Tôi gặp vấn đề tương tự trong Spring WebMVC 4.2.5. Lý do là thông số throwExceptionIfNoHandlerFound của DispatcherServlet. Theo mặc định, giá trị của nó là false, do đó, tất cả các lỗi tạo ra một phản hồi servlet HttpServletResponse.SC_NOT_FOUND servlet và không có ngoại lệ nào bị ném.

Sau khi tôi đặt nó là sự thật, tôi @ExceptionHandlers bắt đầu làm việc

+0

cũng hoạt động cho tôi .. cảm ơn –

0

Có một số tình huống mà cả hai ResponseEntityExceptionHandler@ControllerAdvice đã không làm việc được báo cáo.

Cả hai người trong số họ có nghĩa vụ phải biên dịch các phương pháp kết hợp với @ExceptionHandler dưới lớp vào một nơi chung mà tất cả các bộ điều khiển có thể tham chiếu từ.

Nếu nó không hoạt động cho bạn. Bạn có thể thêm các phương thức @ExceptionHandler vào một lớp phổ biến AbstractController được mở rộng bởi tất cả các bộ điều khiển khác.

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