媒介
在web应用中,请求处理惩罚时,呈现异常长短经常见的。所以当应用呈现种种异常时,举办异常的捕捉可能二次处理惩罚(好比sql异常正常是不能外抛)长短常须要的,好比在开拓对外api处事时,约定了响应的参数名目,如respCode
、respMsg
,挪用方按照错误码举办本身的业务逻辑。本章节就重点讲授下统一异常和数据校验处理惩罚。
springboot
中,默认在发送异常时,会跳转值/error
请求举办错误的揭示,按照差异的Content-Type
揭示差异的错误功效,如json请求时,直接返回json名目参数。
欣赏器会见异常时:
劳务调派系统经被拦截了" class="aligncenter size-full wp-image-29412" title="84110753" src="/uploads/allimg/c180804/153332A040V30-1Q15.png" />
利用postman
会见时:
劳务调派系统经被拦截了" class="aligncenter size-full wp-image-29413" title="65412808" src="/uploads/allimg/c180804/153332A04133F-2H25.png" />
统一异常处理惩罚
显然,默认的异常页是对用户可能挪用者而言都是不友好的,所以一般上我们城市举办实现本身业务的异常提示信息。
建设全局的统一异常处理惩罚类
操作@ControllerAdvice
和@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
名目,
劳务调派系统经被拦截了" class="aligncenter size-full wp-image-29414" title="39077120" src="/uploads/allimg/c180804/153332A041D20-3N51.png" />劳务调派系统经被拦截了" class="aligncenter size-full wp-image-29415" title="26682663" src="/uploads/allimg/c180804/153332A041U30-4T27.png" />
说明异常已经被拦截了。
可拦截差异的异常,举办差异的异常提示,好比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
举办统一参数校验。