2016-05-20 5 views
2

So versuche ich alle nicht abgefangenen Ausnahmen zu protokollieren, die von den Controllern eines Spring-Projekts generisch zurückgegeben werden. Ich konnte dies mit den folgenden Ausnahme-Handler tun:Spring Exception Handler alle Ausnahmen protokollieren, aber ursprüngliche Antwort zurückgeben

@ControllerAdvice 
public class ControllerConfig { 

private final Logger logger = LoggerFactory.getLogger(this.getClass()); 

public static final String DEFAULT_ERROR_VIEW = "error"; 

@ExceptionHandler(HttpMessageNotReadableException.class) 
@ResponseStatus(HttpStatus.BAD_REQUEST) 
public void handleBadRequest(HttpMessageNotReadableException e) { 
    logger.warn("Returning HTTP 400 Bad Request", e); 
    throw e; 
} 

@ExceptionHandler(AccessDeniedException.class) 
public void defaultErrorHandler(HttpServletRequest request, Exception e) throws Exception { 
    logger.error("Error in request:" + request.getRequestURL(), e); 
    throw e; 
} 

Dies auch die Fehlerreaktionen der Anforderung zurück, so dass ich muß nicht zwischen den verschiedenen Fehlerantwortcodes unterscheiden.

jedoch für jeden Aufruf der Methode ein zweites Fehlerprotokoll wegen der Ausnahme in der Methode ausgelöst erstellt: -Code ist aus org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver # doResolveHandlerMethodException

try { 
     if (logger.isDebugEnabled()) { 
      logger.debug("Invoking @ExceptionHandler method: " + exceptionHandlerMethod); 
     } 
     exceptionHandlerMethod.invokeAndHandle(webRequest, mavContainer, exception); 
    } 
    catch (Exception invocationEx) { 
     if (logger.isErrorEnabled()) { 
      logger.error("Failed to invoke @ExceptionHandler method: " + exceptionHandlerMethod, invocationEx); 
     } 
     return null; 
    } 

Gibt es eine klügere Möglichkeit, die ursprüngliche Ausnahme der Methode zurückzugeben?

Antwort

0

Es hängt davon ab, was meinst du mit "eine klügere Möglichkeit, die ursprüngliche Ausnahme zurückzugeben". Was genau möchten Sie dem Kunden zurückgeben? Wenn dies nur die Nachricht der Ausnahme ist, können Sie sie einfach aus dem Ausnahmebehandler zurückgeben und die Methode mit annotieren. Der Frühling erledigt den Rest für Sie.

@ExceptionHandler(HttpMessageNotReadableException.class) 
@ResponseStatus(HttpStatus.BAD_REQUEST) 
@ResponseBody 
public String handleBadRequest(HttpMessageNotReadableException e) { 
    logger.warn("Returning HTTP 400 Bad Request", e); 
    throw e.getMessage(); 
} 

Sie können auch ein benutzerdefiniertes Objekt zurückgeben, das die Ausnahmeinformationen und alle anderen Daten, die Sie wünschen, umschließt.

Verwandte Themen