2014-06-21 14 views
8

Sono nuovo alla primavera. Sto sviluppando una API REST con webmvc a molla. Per la gestione degli errori ho ottenuto questo collegamento http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc-ann-rest-spring-mvc-exceptionsResponseEntityExceptionHandler non viene chiamato quando si verifica un'eccezione

Ho provato a utilizzare ResponseEntityExceptionHandler nel mio progetto. ma ogni volta che il mio controller genera un'eccezione, non raggiunge mai questo ResponseEntityExceptionHandler.

seguito sono il mio frammento di codice

controller

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

eccezioni

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

dispatcher 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

Hai mai trovato una soluzione al tuo problema? – woemler

+0

Ho ricevuto lo stesso problema ... –

+0

Penso che i metodi in RestResponseEntityExceptionHandler verranno utilizzati solo se eseguono l'override dei metodi da ResponseEntityExceptionHandler. –

risposta

3

Non è necessario estendere ResponseEntityExceptionHandler se non avete bisogno di tutte le mappature di eccezioni che fornisce.

Un modo più semplice per scrivere il vostro gestione delle eccezioni:

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

Nota che l'API ResponseEntity costruttore è stato in introdotto nella primavera del 4.1, ma è possibile utilizzare la funzione di costruzione regolare su 4.0.x.

+0

Perché qualcuno avrebbe votato questa risposta senza una spiegazione? 'ResponseEntityExceptionHandler' fornisce extra gestori ma non è necessario estenderlo. La chiave è avere '@ ControllerAdvice' e scrivere i propri metodi annotati' @ ExceptionHandler'. – amertkara

+0

L'ho downsato perché la domanda è come far funzionare ResponseEntityExceptionHandler, non ne ho bisogno in primo luogo. Il "se" in questa risposta indica che è sbagliato e non dovrebbe essere qui – dezzer10

+0

E le eccezioni di sicurezza? –

1

Ho avuto lo stesso problema in Spring WebMVC 4.2.5. Il motivo era il parametro throwExceptionIfNoHandlerFound di DispatcherServlet. Di default il suo valore è false, quindi tutti gli errori generano la risposta del servlet HttpServletResponse.SC_NOT_FOUND e nessun lancio di eccezioni.

dopo essere stata impostata su true, il mio @ExceptionHandlers ha iniziato a lavorare

+0

funziona anche per me .. grazie –

0

Ci sono alcune situazioni in cui ha riferito sia ResponseEntityExceptionHandler e @ControllerAdvice non ha funzionato.

Entrambi devono compilare i metodi annodati con @ExceptionHandler sotto la classe in un luogo comune da cui tutti i controller possono fare riferimento.

Se non funziona per voi. È possibile aggiungere i metodi @ExceptionHandler in una classe comune AbstractController estesa da tutti gli altri controller.

Problemi correlati