前言
在web应用中,请求处理时,出现异常是非常常见的。所以当应用出现各类异常时,进行异常的捕获或者二次处理(比如sql异常正常是不能外抛)是非常必要的,比如在开发对外api服务时,约定了响应的参数格式,如respCode
、respMsg
,调用方根据错误码进行自己的业务逻辑。本章节就重点讲解下统一异常和数据校验处理。
springboot
中,默认在发送异常时,会跳转值/error
请求进行错误的展现,根据不同的Content-Type
展现不同的错误结果,如json请求时,直接返回json格式参数。
浏览器访问异常时:
使用postman
访问时:
统一异常处理
显然,默认的异常页是对用户或者调用者而言都是不友好的,所以一般上我们都会进行实现自己业务的异常提示信息。
创建全局的统一异常处理类
利用@ControllerAdvice
和@ExceptionHandler
定义一个统一异常处理类
- @ControllerAdvice:控制器增强,使@ExceptionHandler、@InitBinder、@ModelAttribute注解的方法应用到所有的 @RequestMapping注解的方法。
- @ExceptionHandler:异常处理器,此注解的作用是当出现其定义的异常时进行处理的方法
创建异常类:CommonExceptionHandler
@ControllerAdvice public class CommonExceptionHandler { /** * 拦截Exception类的异常 * @param e * @return */ @ExceptionHandler(Exception.class) @ResponseBody public Map<String,Object> exceptionHandler(Exception e){ Map<String,Object> result = new HashMap<String,Object>(); result.put("respCode", "9999"); result.put("respMsg", e.getMessage()); //正常开发中,可创建一个统一响应实体,如CommonResp return result; } }
多余不同异常(如自定义异常),需要进行不同的异常处理时,可编写多个exceptionHandler方法,注解ExceptionHandler
指定处理的异常类,如
/** * 拦截 CommonException 的异常 * @param ex * @return */ @ExceptionHandler(CommonException.class) @ResponseBody public Map<String,Object> exceptionHandler(CommonException ex){ log.info("CommonException:{}({})",ex.getMsg(), ex.getCode()); Map<String,Object> result = new HashMap<String,Object>(); result.put("respCode", ex.getCode()); result.put("respMsg", ex.getMsg()); return result; }
由于加入了@ResponseBody
,所以返回的是json
格式,
说明异常已经被拦截了。
可拦截不同的异常,进行不同的异常提示,比如NoHandlerFoundException
、HttpMediaTypeNotSupportedException
、AsyncRequestTimeoutException
等等,这里就不列举了,读者可自己加入后实际操作下。
对于返回页面时,返回ModelAndView
即可,如
@ExceptionHandler(value = Exception.class) public ModelAndView defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception { ModelAndView mav = new ModelAndView(); mav.addObject("exception", e); mav.addObject("url", req.getRequestURL()); mav.setViewName(DEFAULT_ERROR_VIEW); return mav; }
由于工作中都是才有前后端分离开发模式,所以一般上都没有直接返回资源页的需求了,一般上都是返回固定的响应格式,如respCode
、respMsg
、data
,前端通过判断respCode
的值进行业务判断,是弹窗还是跳转页面。
数据校验
在web开发时,对于请求参数,一般上都需要进行参数合法性校验的,原先的写法时一个个字段一个个去判断,这种方式太不通用了,所以java的JSR 303: Bean Validation
规范就是解决这个问题的。
JSR 303
只是个规范,并没有具体的实现,目前通常都是才有hibernate-validator
进行统一参数校验。
JSR303定义的校验类型
Constraint | 详细信息 |
---|---|
@Null |
被注释的元素必须为 null |
@NotNull |
被注释的元素必须不为 null |
@AssertTrue |
被注释的元素必须为 true |
@AssertFalse |
被注释的元素必须为 false |
@Min(value) |
被注释的元素必须是一个数字,其值必须大于等于指定的最小值 |
@Max(value) |
被注释的元素必须是一个数字,其值必须小于等于指定的最大值 |
@DecimalMin(value) |
被注释的元素必须是一个数字,其值必须大于等于指定的最小值 |
@DecimalMax(value) |
被注释的元素必须是一个数字,其值必须小于等于指定的最大值 |
@Size(max, min) |
被注释的元素的大小必须在指定的范围内 |
@Digits (integer, fraction) |
被注释的元素必须是一个数字,其值必须在可接受的范围内 |
@Past |
被注释的元素必须是一个过去的日期 |
@Future |
被注释的元素必须是一个将来的日期 |
@Pattern(value) |
被注释的元素必须符合指定的正则表达式 |
Hibernate Validator 附加的 constraint
Constraint | 详细信息 |
---|---|
@Email |
被注释的元素必须是电子邮箱地址 |
@Length |
被注释的字符串的大小必须在指定的范围内 |
@NotEmpty |
被注释的字符串的 |
首页 上一页 1 2 3 下一页 尾页 1/3/3 | |
【大 中 小】【打印】 【繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部】 | |
上一篇:在 Java 的反射中,Class.forName.. | 下一篇:SpringBoot | 第七章:过滤器、监.. |