Allgemeiner Exception-Handler für Spring REST Controller

Hat man eine REST API mit den Spring REST Controllern aufgebaut, kann es sinnvoll sein, die Fehlerbehandlung an einer zentralen Stelle abzuhandeln. So kann man beispielsweise bei einer aufgetretenen Exception diese in einem definierten JSON-Format an die Clients zurückliefern

Spring stellt hierfür die Annotation @ExceptionHandler zur Verfügung. Diese kann in einer mit @ControllerAdvice annotierten Klasse verwendet werden und gilt somit Projekt-weit für alle Controller-Klassen, sofern der Exception-Handler in dieser nicht eigens definiert wird.

Generell kann oder sollte man für jede Exception eine eigene Methode bereitstellen um den Usern aussagekräftige Fehlermeldungen zu liefern. Bei internen Schnittstellen kann es jedoch auch sinnvoll sein, alle Exceptions über eine einzige Methode zu behandeln.

Mit der folgenden Klasse werden alle in Controllern auftretenden Exceptions abgefangen und dem Client als JSON-Response zurückgeliefert:


@ControllerAdvice
public class ApiRestExceptionHandler extends ResponseEntityExceptionHandler {    
    /**
     * General Exception handler
     * 
     * @param e
     * @param request
     * @return
     */
    @ExceptionHandler({Throwable.class})
	protected ResponseEntity<Object> handleException(Throwable e, WebRequest request) {   	
    	String message = e.getMessage();
   	
    	GeneralErrorResource error = new GeneralErrorResource("NOK", message);

        return handleExceptionInternal((Exception)e, error, getJsonHeaders(), HttpStatus.CONFLICT, request);    	
    }    
    
    
    private HttpHeaders getJsonHeaders()
    {
        HttpHeaders headers = new HttpHeaders();
       	headers.set("Content-Type", "application/json; charset=utf-8");
        return headers;    	
    }
}Code-Sprache: JavaScript (javascript)

Die GeneralErrorResource-Klasse ist ein einfaches POJO welches an den Client entprechend die Exception-Meldung zurückliefert und beliebig individuell gestaltet werden kann:


@JsonIgnoreProperties(ignoreUnknown = true)
public class GeneralErrorResource {
    private String code;
    private String message;
    
    public GeneralErrorResource(String code, String message) {
    	this.code = code;
    	this.message = message;
    }
    
	public String getCode() {
		return code;
	}
	
	public void setCode(String code) {
		this.code = code;
	}
	
	public String getMessage() {
		return message;
	}
	
	public void setMessage(String message) {
		this.message = message;
	}
}   
    Code-Sprache: JavaScript (javascript)

Schreibe einen Kommentar