zoukankan      html  css  js  c++  java
  • springmvc——基于xml的异常映射和基于注解的异常映射

    SpringMVC提供了基于XML和基于注解两种异常映射机制。这两种异常映射不能够只使用一个,他们需要一起使用。因为有些异常是基于注解异常映射捕获不到的。

    在springmvc中,一个请求如果是由<mvc:view-controller>处理的,在这过程中如果抛出了异常,那么就得用基于xml的异常映射来捕获处理这个异常。如果请求是有@RequestMapping这个注解来处理的,在这过程中发生了异常,那么就得使用基于注解的异常映射来捕获并处理这个异常。

    注意:通过@RequestMapping这个注解来处理的请求,在这个过程中抛出了异常,就会找基于注解的异常映射进行处理,如果没有配置基于注解的异常映射,那么就会找基于xml的异常映射

    一、基于xml的异常映射

    步骤:

    1.在springmvc的配置文件中配置SimpleMappingExceptionResolver

        <!--配置基于xml的异常映射-->
        <bean id="simpleMappingExceptionResolver"
              class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
            <property name="exceptionMappings">
                <props>
                    <prop key="java.lang.Exception">system-error</prop>
                </props>
            </property>
        </bean>

    注意

    1.exceptionMappings是SimpleMappingExceptionResolver的一个成员属性。

    2.prop中的system-error会经过视图解析器处理,所以如果发生java.lang.Exception异常就会跳转到system-error.jsp页面

    二、基于注解的异常映射

    这里就涉及两个注解了:

    @ControllerAdvice:这个注解就是增强型控制器,作用是将对于控制器的全局配置放在同一个位置(类)。此注解详情可参考这篇博客https://www.cnblogs.com/yanggb/p/10859907.html

    @ExceptionHandler:将一个具体的异常类型和一个方法关联起来

    步骤:

    1.创建一个类,类上添加@ControllerAdvice注解

    @ControllerAdvice
    public class CrowdExceptionResolver {
    }

    2.使用@ExceptionHandler绑定异常(可以绑定多个异常,但通常只绑定一个异常),然后在方法中编写该异常的处理逻辑

    @ControllerAdvice
    public class CrowdExceptionResolver {
        @ExceptionHandler(value = LoginFailedException.class)
        public ModelAndView resolveLoginFailedException(LoginFailedException exception,
                                                        HttpServletRequest request,
                                                        HttpServletResponse response) throws IOException {
            String viewName = "admin-login";
            return commonResolve(viewName, exception, request, response);
        }
        private ModelAndView commonResolve(
                // 异常处理完成后要去的页面
                String viewName,
                // 实际捕获到的异常类型
                Exception exception,
                // 当前请求对象
                HttpServletRequest request,
                // 当前响应对象
                HttpServletResponse response) throws IOException {
            // 1.判断当前请求类型
            boolean judgeResult = CrowdUtil.judgeRequestType(request);
            // 2.如果是Ajax请求
            if (judgeResult) {
                // 3.创建ResultEntity对象
                ResultEntity<Object> resultEntity = ResultEntity.failed(exception.getMessage());
                // 4.创建Gson对象
                Gson gson = new Gson();
                // 5.将ResultEntity对象转换为JSON字符串
                String json = gson.toJson(resultEntity);
                // 6.将JSON字符串作为响应体返回给浏览器
                response.getWriter().write(json);
                // 7.由于上面已经通过原生的response对象返回了响应,所以不提供ModelAndView对象
                return null;
            }
            // 8.如果不是Ajax请求则创建ModelAndView对象
            ModelAndView modelAndView = new ModelAndView();
            // 9.将Exception对象存入模型
            modelAndView.addObject(CrowdConstant.ATTR_NAME_EXCEPTION, exception);
            // 10.设置对应的视图名称
            modelAndView.setViewName(viewName);
            // 11.返回modelAndView对象
            return modelAndView;
        }
    }
  • 相关阅读:
    启动或重启Oracle数据以及监听
    占坑 对自己的目标要求
    线程的使用经验(包括 Thread/Executor/Lock-free/阻塞/并发/锁等)
    接口的调用Client测试
    解决ftp登录问题:500 OOPS: cannot change directory:/home/xxx 500 OOPS: child died
    Tomcat7性能调优
    mysql性能调优
    四:JVM调优原理与常见异常处理方案
    redis的线程模型 与 压力测试
    为什么要用消息队列 及 自己如何设计一个mq架构
  • 原文地址:https://www.cnblogs.com/bear7/p/13570402.html
Copyright © 2011-2022 走看看