SpringMVC异常映射

2021-04-14 03:28

阅读:584

标签:erro   统一   逻辑   mamicode   web   rip   cat   servlet   lse   

异常映射

作用

统一管理项目中的异常

  抛出异常

  显示异常

    普通请求:在页面上显示异常信息

    Ajax请求:返回json数据

异常映射的工作机制

技术图片

 

服务器接收到用户请求过程中,如果有异常则抛出异常,SpringMVC的异常映射机制则会判断请求的类型从而响应不同的异常映射请求.

 

判断请求类型的工具方法

判断依据

技术图片

 

创建工具类

/**
 * @Description 判断请求是ajax还是普通请求
 */
public class CrowdUtil {
    /**
     * 判断请求是否是ajax请求
     * @param request
     * @return
     */
    public static boolean isAjaxRequest(HttpServletRequest request) {
        String accept = request.getHeader("Accept");
        String xRequestHeader = request.getHeader("X-Requested-With");
        return ((accept!=null && accept.contains("application/json")) || (xRequestHeader != null && xRequestHeader.equals("XMLHttpRequest")));
    }
}

异常映射实现方式

基于xml

步骤:

  • 配置异常解析器
  • 新建自定义异常界面

    bean id="simpleMappingExceptionResolver"
          class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
       
        property name="exceptionMappings">
            props>
                
                prop key="java.lang.Exception">system-errorprop>
            props>
        property>
        
        
    bean>

然后指定映射的jsp页面即可.

 

基于注解

  • 加入gson依赖:处理json数据
  • 创建异常处理类
// @ControllerAdvice,表示这是一个基于注解的 异常处理类
@ControllerAdvice
public class ExceptionResolver {

    // @ExceptionHandler 建立异常和类的映射关系
    @ExceptionHandler(value = ArithmeticException.class)
    public ModelAndView resolverException(ArithmeticException e, HttpServletRequest request, HttpServletResponse response) throws IOException {
        // 判断请求的类型
        boolean requestType = CrowdUtil.isAjaxRequest(request);

        // 如果是ajax请求
        if (requestType) {
            // 创建ResultEntity
            ResultEntity failed = ResultEntity.failed(e.getMessage());
            // 创建Gson
            Gson gson = new Gson();
            // 将ResultEntity转为json
            String json = gson.toJson(failed);
            // 将json数据返还给浏览器
            response.getWriter().write(json);
            // 因为使用了原生respones对象返回了响应,不提供ModelAndView对象
            return null;
        } else {
            ModelAndView modelAndView = new ModelAndView();
            modelAndView.addObject("exception", e);
            modelAndView.setViewName("system-error");
            return modelAndView;
        }
    }

    /**
     * 提取可复用部分
     *
     * @return
     */
    public ModelAndView common(String viewName, Exception e, HttpServletRequest request, HttpServletResponse response) throws IOException {
        boolean requestType = CrowdUtil.isAjaxRequest(request);
        if (requestType) {
            ResultEntity failed = ResultEntity.failed(e.getMessage());

            String json = new Gson().toJson(failed);

            response.getWriter().write(json);
            return null;
        } else {
            ModelAndView modelAndView = new ModelAndView();
            modelAndView.addObject("exception", e);
            modelAndView.setViewName(viewName);
            return modelAndView;
        }
    }

    @ExceptionHandler(LoginFailedException.class)
    public ModelAndView resolverLoginFailedException(LoginFailedException e, HttpServletRequest request, HttpServletResponse response) throws IOException {
        String viewName = "/ad-login";
        ModelAndView modelAndView = common(viewName, e, request, response);
        return modelAndView;
    }

    @ExceptionHandler(AccessForbidenException.class)
    public ModelAndView resolverAccessForbiddenException(AccessForbidenException e, HttpServletRequest request, HttpServletResponse response) throws IOException {
        String viewName = "/ad-login";
        ModelAndView modelAndView = common(viewName, e, request, response);
        return modelAndView;
    }

    @ExceptionHandler(LoginAccountAlreadlyInUse.class)
    public ModelAndView resolverLoginAccountAlreadlyInUseException(LoginAccountAlreadlyInUse e, HttpServletRequest request, HttpServletResponse response) throws IOException {
        String viewName = "/add";
        ModelAndView modelAndView = common(viewName, e, request, response);
        return modelAndView;
    }

    @ExceptionHandler(LoginAccountAlreadlyInUseForUpdate.class)
    public ModelAndView resolverLoginAccountAlreadlyInUseForUpdateException(LoginAccountAlreadlyInUseForUpdate e, HttpServletRequest request, HttpServletResponse response) throws IOException {
        String viewName = "system-error";
        ModelAndView modelAndView = common(viewName, e, request, response);
        return modelAndView;
    }
}

 

  

 

SpringMVC异常映射

标签:erro   统一   逻辑   mamicode   web   rip   cat   servlet   lse   

原文地址:https://www.cnblogs.com/Adam-Ye/p/13339263.html


评论


亲,登录后才可以留言!