我有一个用 @ResponseStatus
注释的异常,如下所示:
@ResponseStatus(value = HttpStatus.UNPROCESSABLE_ENTITY, reason = "Restrioctions violated. Need confirmation.")
@ResponseBody
public class RestrictionExceptions extends Exception {
private List<RestrictionViolation> restrictionViolations;
但是,当引发异常时,@ResponseStatus
声明中只有 HTTP 状态代码和 reason
。是否可以在错误响应正文中包含 restrictionViolations
?
我想将异常声明保留在异常本身中,如果可能的话,我不想在 Controller 中引入一些异常处理方法。
最佳答案
您可以使用您希望在正文中包含的字段创建一个 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());
}
}
关于java - Spring MVC中的异常处理——异常描述,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34783490/