2014-06-21 30 views
8

İlkbaharda yeni yaşıyorum. Bahar webmvc ile bir REST api geliştiriyorum. Hata Giderme için bu bağlantıyı aldım http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc-ann-rest-spring-mvc-exceptionsResponseEntityExceptionHandler istisna oluştuğunda çağrılmadı

Projemde ResponseEntityExceptionHandler'ı kullanmaya çalıştım. ama denetleyicim istisna atarsa, bu ResponseEntityExceptionHandler'a asla ulaşmaz. Takip

benim kod parçacığı

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

@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; 
    } 
} 

İstisnalar

Kontrolör olan

@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); 
    } 
} 

memuru 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

Sorununuza bir çözüm buldunuz mu? – woemler

+0

Aynı sorunun var ... –

+0

RestResponseEntityExceptionHandler'daki yöntemleriniz, yalnızca ResponseEntityExceptionHandler yöntemlerini geçersiz kılarlarsa kullanılacaktır. –

cevap

3

sizler için hazırlanmış özel durum eşleşmeleri gerekmez eğer ResponseEntityExceptionHandler uzatmak gerekmez.

istisna işleme yazmak için basit bir yolu: ResponseEntity oluşturucu API Bahar 4.1'de sunulmuştur içinde olmuştur

@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"); 
    } 
} 

Not, ancak 4.0.x. düzenli kurucu kullanabilirsiniz

+0

çalıştı. Neden kimse bu cevabı açıklama yapmadan reddetti? ResponseEntityExceptionHandler, ekstra işleyicileri getiriyor, ancak bunları genişletmeniz gerekmiyor. Anahtar, @ ControllerAdvice 'e sahip olmak ve kendi @ @ ExceptionHandler' açıklamalı yöntemlerinizi yazmaktır. – amertkara

+0

Düşündüm çünkü soru, ResponseEntityExceptionHandler'ın nasıl çalıştığını sormaktı, ilk etapta bir tanesine ihtiyacım yok. Bu yanıttaki 'if', yanlış olduğunu ve burada olmamasını gösterir – dezzer10

+0

Güvenlik istisnaları hakkında ne var? –

1

Spring WebMVC 4.2.5'te aynı sorunu yaşıyorum. Nedeni, DispatcherServlet'un throwExceptionIfNoHandlerFound parametresidir. Varsayılan olarak false değeridir, bu nedenle tüm hatalar HttpServletResponse.SC_NOT_FOUND sunucu yanıtı üretir ve istisna atar. Ben true olarak ayarlayın sonra

, benim @ExceptionHandlers

+0

benim için de çalışıyor .. teşekkürler –

0

bazı hem ResponseEntityExceptionHandler ve @ControllerAdvice işe yaramadı durumları bildirdi vardır çalışmaya başladı.

Her ikisi de, sınıfın altında @ExceptionHandler ile belirtilen yöntemleri, tüm denetleyicilerin başvurabileceği ortak bir yere derlemek zorundadır.

Sizin için işe yaramıyorsa. Tüm diğer denetleyiciler tarafından genişletilen ortak bir AbstractController sınıfına @ExceptionHandler yöntemlerini ekleyebilirsiniz.