欢迎访问昆山宝鼎软件有限公司网站! 设为首页 | 网站地图 | XML | RSS订阅 | 宝鼎邮箱 | 后台管理


新闻资讯

MENU

软件开发知识
原文出处: oKong

媒介

在web应用中,请求处理惩罚时,呈现异常长短经常见的。所以当应用呈现种种异常时,举办异常的捕捉可能二次处理惩罚(好比sql异常正常是不能外抛)长短常须要的,好比在开拓对外api处事时,约定了响应的参数名目,如respCoderespMsg,挪用方按照错误码举办本身的业务逻辑。本章节就重点讲授下统一异常和数据校验处理惩罚。

springboot中,默认在发送异常时,会跳转值/error请求举办错误的揭示,按照差异的Content-Type揭示差异的错误功效,如json请求时,直接返回json名目参数。

欣赏器会见异常时:

 说明异常已 <a href=劳务调派系统经被拦截了" class="aligncenter size-full wp-image-29412" title="84110753" src="/uploads/allimg/c180804/153332A040V30-1Q15.png" />

利用postman会见时:

 说明异常已 <a href=劳务调派系统经被拦截了" class="aligncenter size-full wp-image-29413" title="65412808" src="/uploads/allimg/c180804/153332A04133F-2H25.png" />

统一异常处理惩罚

显然,默认的异常页是对用户可能挪用者而言都是不友好的,所以一般上我们城市举办实现本身业务的异常提示信息。

建设全局的统一异常处理惩罚类

操作@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名目,

     说明异常已 <a href=劳务调派系统经被拦截了" class="aligncenter size-full wp-image-29414" title="39077120" src="/uploads/allimg/c180804/153332A041D20-3N51.png" /> 说明异常已 <a href=劳务调派系统经被拦截了" class="aligncenter size-full wp-image-29415" title="26682663" src="/uploads/allimg/c180804/153332A041U30-4T27.png" />

    说明异常已经被拦截了。

    可拦截差异的异常,举办差异的异常提示,好比NoHandlerFoundExceptionHttpMediaTypeNotSupportedExceptionAsyncRequestTimeoutException等等,这里就不罗列了,读者可本身插手后实际操纵下。

    对付返回页面时,返回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;
        }

    由于事情中都是才有前后端分分开拓模式,所以一般上都没有直接返回资源页的需求了,一般上都是返回牢靠的响应名目,如respCoderespMsgdata,前端通过判定respCode的值举办业务判定,是弹窗照旧跳转页面。

    数据校验

    在web开拓时,对付请求参数,一般上都需要举办参数正当性校验的,原先的写法时一个个字段一个个去判定,这种方法太不通用了,所以java的JSR 303: Bean Validation类型就是办理这个问题的。

    JSR 303只是个类型,劳务派遣管理系统,并没有详细的实现,今朝凡是都是才有hibernate-validator举办统一参数校验。