2016-01-14 46 views
0

我已經例外anotated與@ResponseStatus這樣的:異常在Spring MVC處理 - 異常說明

@ResponseStatus(value = HttpStatus.UNPROCESSABLE_ENTITY, reason = "Restrioctions violated. Need confirmation.") 
@ResponseBody 
public class RestrictionExceptions extends Exception { 

    private List<RestrictionViolation> restrictionViolations; 

但當引發異常,只有HTTP狀態代碼,並從@ResponseStatus聲明reason。錯誤響應正文中是否也可以包含restrictionViolations

我想在異常本身中保存異常聲明,如果可能的話,我不想在控制器中引入一些異常處理方法。

回答

1

你可以用你想在身體中的字段創建ErrorResource:

public class ErrorResource { 
    private String reason; 
    private String value; 
    private List<RestrictionViolation> restrictionViolations; 
    .... 
} 

和處理的處理程序異常:

@ControllerAdvice 
public class RestrictionExceptionsHandler { 

@ExceptionHandler({ RestrictionExceptions.class }) 
protected ResponseEntity<ErrorResource> handleInvalidRequest(Exception exception) { 
    RestrictionExceptions restrictionExceptions = (RestrictionExceptions) exception; 

    ErrorResource error = new ErrorResource(); 
    Class clazz = exception.getClass(); 
    if(clazz.isAnnotationPresent(ResponseStatus.class)){ 
     ResponseStatus responseStatus = (ResponseStatus) clazz.getAnnotation(ResponseStatus.class); 
     error.setValue(responseStatus.value()); 
     error.setReason(responseStatus.reason()); 
    } 
    error.setRestrictionViolations(restrictionExceptions.getRestrictionViolations()); 

    HttpHeaders headers = new HttpHeaders(); 
    headers.setContentType(MediaType.APPLICATION_JSON); 

    return new ResponseEntity<ErrorResource>(error, error.getValue()); 
} 
}