ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

SpringMVC异常映射

2020-07-19 12:31:26  阅读:281  来源: 互联网

标签:return viewName 映射 SpringMVC request ModelAndView modelAndView 异常 response


异常映射

作用

统一管理项目中的异常

  抛出异常

  显示异常

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

    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>
                <!--
                key表示异常类型
                value表示映射的视图界面
                -->
                <prop key="java.lang.Exception">system-error</prop>
            </props>
        </property>
        <!--使用exceptionAttribute可以修改异常对象存入请求域时使用的属性名-->
        <!--<property name="exceptionAttribute"></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<Object> 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<Object> 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;
    }
}

 

  

 

标签:return,viewName,映射,SpringMVC,request,ModelAndView,modelAndView,异常,response
来源: https://www.cnblogs.com/Adam-Ye/p/13339263.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有