常规的全局异常捕获代码
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* 全局异常捕获处理
*/
@ControllerAdvice
public class MyExceptionHandler {
/**
* 统一异常处理
*
* @param e
* @return
*/
@ResponseBody
@ExceptionHandler(value = Exception.class)
public ResponseMessage errorHandler(Exception e) {
e.printStackTrace();
return ResponseMessage.error(10086, e.getMessage());
}
/**
* 自定义异常的处理
*
* @param e
* @return
*/
@ResponseBody
@ExceptionHandler(value = RRException.class)
public ResponseMessage myErrorHandler(RRException e) {
e.printStackTrace();
return ResponseMessage.error(e.getCode(), e.getMsg());
}
}
存在的问题
此时,如果出现异常,返回的信息如下:
{
"message": "Validation failed for argument [0] in public com.schdri.bimgis.road.domain.common.entity.ResponseMessage<com.schdri.bimgis.road.service.vo.organization.OrganizationVo> com.schdri.bimgis.road.domain.controller.OrganizationController.update(com.schdri.bimgis.road.service.vo.organization.OrganizationVo): [Field error in object 'organizationVo' on field '_id': rejected value [null]; codes [NotNull.organizationVo._id,NotNull._id,NotNull.java.lang.String,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [organizationVo._id,_id]; arguments []; default message [_id]]; default message [id不能为空!]] ",
"result": null,
"status": 500,
"timestamp": 1599644944593,
"code": null,
"includes": null,
"excludes": null
}
显然,请求响应的提示信息不是我们想要的。
修改后的代码
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
import org.springframework.web.util.WebUtils;
/**
* 全局异常捕获处理
*/
@ControllerAdvice
public class MyExceptionHandler extends ResponseEntityExceptionHandler {
/**
* 统一异常处理
*
* @param e
* @return
*/
@ResponseBody
@ExceptionHandler(value = Exception.class)
public ResponseMessage errorHandler(Exception e) {
e.printStackTrace();
return ResponseMessage.error(10086, e.getMessage());
}
/**
* 自定义异常的处理
*
* @param e
* @return
*/
@ResponseBody
@ExceptionHandler(value = RRException.class)
public ResponseMessage myErrorHandler(RRException e) {
e.printStackTrace();
return ResponseMessage.error(e.getCode(), e.getMsg());
}
/**
* 自定义所有异常类型的响应主体
*
* @param ex 异常
* @param body 响应主体
* @param headers 响应头
* @param status 响应状态
* @param request 当前请求
* @return
*/
@Override
protected ResponseEntity<Object> handleExceptionInternal(Exception ex, Object body, HttpHeaders headers, HttpStatus status, WebRequest request) {
if (HttpStatus.INTERNAL_SERVER_ERROR.equals(status)) {
//服务器内部错误 - 500
request.setAttribute(WebUtils.ERROR_EXCEPTION_ATTRIBUTE, ex, WebRequest.SCOPE_REQUEST);
}
//打印异常信息
logger.error(ex.getMessage(), ex);
//返回错误code 和 异常信息
ResponseMessage<Object> res = ResponseMessage.error(status.value(), ex.getMessage());
return new ResponseEntity<>(res, headers, status);
}
/**
* 自定义MethodArgumentNotValidException的响应
*
* @param ex
* @param headers
* @param status
* @param request
* @return
*/
@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
StringBuffer stringBuffer = new StringBuffer();
ex.getBindingResult().getAllErrors().forEach(error ->
stringBuffer.append(error.getDefaultMessage()).append(";")
);
ResponseMessage<Object> res = ResponseMessage.error(status.value(), ex.getMessage());
return new ResponseEntity<>(res, headers, HttpStatus.OK);
}
}
返回
{
"message": "id不能为空!",
"result": null,
"status": 500,
"timestamp": 1599644944593,
"code": null,
"includes": null,
"excludes": null
}