使用场景:
使用spring mvc 4的业务controller中的一个处理请求的方法
public ResponseEntity comment(@RequestBody @Valid OrderCommentReq req)
.......................................
这里 OrderCommentReq 请求用来接收app端的json格式的参数,
public class OrderCommentReq extends BaseReq{ @NotEmpty(message = "未登录") private String token;
。。。。。。。。。
不符合参数规范的请求会返回 http status 400。 这样客户端并不能获取具体错误信息,很不友好。
须用异常拦截器来拦截后统一处理:
@ControllerAdvice public class ExceptionHandlerController { private static Logger logger = LoggerFactory.getLogger(ExceptionHandlerController.class); @ExceptionHandler(value = {Exception.class}) public ResponseEntity hadlerException(final Exception ex, final WebRequest req){ Map<String,String> errorMap = new HashMap<>(); logger.error("拦截异常-",ex); //参数错误 if(ex instanceof MethodArgumentNotValidException){ BindingResult result = ((MethodArgumentNotValidException) ex).getBindingResult(); wrapperError(result,errorMap); new ResponseEntity<Object>(errorMap, HttpStatus.OK); } //其他错误 errorMap.put("401","系统错误,请稍后再试"); return new ResponseEntity<Object>(errorMap, HttpStatus.OK); } private void wrapperError(BindingResult result,Map<String,String> errorMap){ List<ObjectError> list = result.getAllErrors(); String eMsg = ""; if(list.size() > 0){ eMsg = list.get(0).getDefaultMessage(); } errorMap.put("code","102"); errorMap.put("msg",eMsg); } }
这样就可以返回 http status 200 的带具体参数错误信息的json数据。