接着上一篇《springmvc 经过异常加强返回给客户端统一格式》讲经过spring ControllerAdvice对各类异常进行拦截处理,统一格式返回给客户端。html
接下来咱们更精细的讲,经过@ExceptionHandler拦截异常,提示参数客户端哪些参数没有传或参数数据类型不一致,方便客户端服务端联调测试。java
简述一下上一篇拦截异常主要流程:web
1.自定义一个类RestExceptionHandler,并使用@ControllerAdvice注解,表示这个类是控制器加强;spring
2.在RestExceptionHandler新建一个方法,并使用@ExceptionHandler({Exception.clss})注解在方法上,表示这个方法处理异常信息。sql
3.在springMvc.xml里配置express
<context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice" />
@ExceptionHandler注解容许咱们指定异常类型进行拦截处理,也能够对自定义异常拦截。mvc
那么咱们来看看机springmvc对于http请求的异常类型。nosql
Exception Typepost |
HTTP Status Code 测试 |
ConversionNotSupportedException |
500 (Internal Server Error) |
HttpMediaTypeNotAcceptableException |
406 (Not Acceptable) |
HttpMediaTypeNotSupportedException |
415 (Unsupported Media Type) |
HttpMessageNotReadableException |
400 (Bad Request) |
HttpMessageNotWritableException |
500 (Internal Server Error) |
HttpRequestMethodNotSupportedException |
405 (Method Not Allowed) |
MissingServletRequestParameterException |
400 (Bad Request) |
NoSuchRequestHandlingMethodException |
404 (Not Found) |
TypeMismatchException |
400 (Bad Request) |
springmvc内部已经为咱们定义好了http请求常见的异常类型,咱们只须要使用@ExceptionHandler({MissingServletRequestParameterException.class})注解在方法上,方法参数类型就是咱们指定的异常类型,就能获取到缺乏参数异常时的异常对象。
//参数类型不匹配 //getPropertyName()获取数据类型不匹配参数名称 //getRequiredType()实际要求客户端传递的数据类型 @ExceptionHandler({TypeMismatchException.class}) @ResponseBody public String requestTypeMismatch(TypeMismatchException ex){ ex.printStackTrace(); return outputJson(-400, "参数类型不匹配,参数" + ex.getPropertyName() + "类型应该为" + ex.getRequiredType()); } //缺乏参数异常 //getParameterName() 缺乏的参数名称 @ExceptionHandler({MissingServletRequestParameterException.class}) @ResponseBody public String requestMissingServletRequest(MissingServletRequestParameterException ex){ ex.printStackTrace(); return outputJson(-400, "缺乏必要参数,参数名称为" + ex.getParameterName()); }
这样无论是参数异常,仍是数据类型异常,仍是请求方法异常,都能作到精细的处理,精确到某个方法的参数和数据类型,给客户端提示更有意义的信息。