zoukankan      html  css  js  c++  java
  • springMVC --全局异常处理(两种方式)

    首先看springMVC的配置文件:

    <!-- 全局异常配置 start -->     
         <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">     
             <property name="exceptionMappings">     
                 <props>     
                     <prop key="java.lang.Exception">errors/error</prop>     
                     <prop key="java.lang.Throwable">errors/err</prop>     
                 </props>     
             </property>     
             <property name="statusCodes">     
                 <props>     
                     <prop key="errors/error">500</prop>     
                     <prop key="errors/404">404</prop>     
                 </props>     
             </property>     
             <!-- 设置日志输出级别,不定义则默认不输出警告等错误日志信息 -->     
             <property name="warnLogCategory" value="WARN"></property>     
             <!-- 默认错误页面,当找不到上面mappings中指定的异常相应视图时,使用本默认配置 -->     
             <property name="defaultErrorView" value="errors/error"></property>     
             <!-- 默认HTTP状态码 -->     
             <property name="defaultStatusCode" value="500"></property>     
         </bean>     
         <!-- 全局异常配置 end -->

    这里基本的类是SimpleMappingExceptionResolver类。和他的父类AbstractHandlerExceptionResolver类。

    能够看到源代码中和上述配置相应的属性;



    另外要注意的是日志

    <span style="font-size:14px;"><property name="warnLogCategory" value="WARN"></property></span>

    级别设置为WARN:



    也能够实现HandlerExceptionResolver接口或者继承SimpleMappingExceptionResolver,写一个自己的异常处理程序

    public class SpringMVCSimpleMappingExceptionResolver extends SimpleMappingExceptionResolver {
    	
    	public static final Log log = LogFactory.getLog(SpringMVCSimpleMappingExceptionResolver.class);
    	
    	@Override
    	protected ModelAndView doResolveException(HttpServletRequest request,
    			HttpServletResponse response, Object handler, Exception ex) {
    		ModelAndView mv = null;
    		String accept = request.getHeader("accept");
            if (accept != null && !(accept.indexOf("application/json") > -1 
            		|| (request.getHeader("X-Requested-With") != null 
            		&& request.getHeader("X-Requested-With").indexOf("XMLHttpRequest") > -1))) {
                mv = super.doResolveException(request, response, handler, ex);
            } else {
                try { 
                	// json 请求返回
                    PrintWriter writer = response.getWriter();  
                    writer.write(Return.failure((ex.getMessage())));
                    writer.flush();
                } catch (IOException e) {
                	if (log.isInfoEnabled()) {
                		log.info(StringUtil.getTrace(e));
                	}
                }
            }
            doLog((HandlerMethod) handler, ex);
            return mv;
    	}
    	
    	/**
    	 * 记录异常日志
    	 * 
    	 * @param handler
    	 * @param excetpion
    	 */
    	private void doLog(HandlerMethod handler, Exception excetpion) {
            if (log.isEnabledExceptionDb()) {
            	// 异常信息日志入库
            }
    	}	
    }

  • 相关阅读:
    虚拟机(VM) windows server2003 里终于有声音了 Kenny
    web 打印 webrower 控件的ExecWB 及 兼容IE6 IE7 IE8 打印 办法 Kenny
    周三了,工作状态还没调回来 Kenny
    [转]javascript 异步调用 后台.cs里的方法 PageMethods如何使用 Kenny
    FLASHSPI
    函数指针的使用:使程序跳转到Flash指定位置
    关于内存对齐
    SD卡实验:神舟IV
    LCD 横屏竖屏
    全局变量、局部变量、静态全局变量、静态局部变量的区别
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/7049690.html
Copyright © 2011-2022 走看看