SpringMVC 全局異常處理的簡單應用

    在SpringMVC框架的項目開發過程當中,你還在使用 try{} catch(){} 輸出異常嗎?,那樣你就真的OUT了,SpringMVC爲咱們提供了強大的異常捕捉類,咱們只須要稍稍處理便可;java

    1, 編寫全局處理類:web

package com.xt.shop.base.exception;

import java.io.IOException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver;


/**
 *@description TODO SpringMVC異常捕捉類
 *@date  2018年1月4日
 *@author  geYang
 **/
public class MyExceptionResolver extends AbstractHandlerExceptionResolver {

    @Override
    protected ModelAndView doResolveException(HttpServletRequest request, 
            HttpServletResponse response, Object handler,Exception e) {
        // TODO SpringMVC 全局異常捕捉
        String msg = null;
        if(e instanceof MyException){
            msg = e.getMessage();
        } else if(e instanceof Exception){
            msg = "網絡異常或系統錯誤,請從新請求";
        }
        try {
            response.getOutputStream().write(msg.getBytes("UTF-8"));
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        return null;
    }

}

2, 將該類配置到 spring-mvc.xml 配置文件中:spring

<!-- 異常處理校驗配置: -->
	<bean class="com.xt.shop.base.exception.MyExceptionResolver">
		<property name="order" value="0" />
	</bean>

沒錯,就是這麼簡單; apache

 

方法二:  使用繼承異常處理來全局處理:spring-mvc

package com.chdj.exception;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.logging.LogFactory;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import com.chdj.util.MyResult;


/**  
 * Describe:異常集中處理類,經過Controller繼承該類實現
 * Date:2018/01/05
 */ 
public abstract class ExceptionController { 
	@ResponseBody
    @ExceptionHandler  
    public Object exp(HttpServletRequest request, Exception e) {
		e.printStackTrace();
    	LogFactory.getLog(super.getClass()).error(e.getMessage(), e);
		return MyResult.getFalse(e.getMessage()); 
    }
}

/**
 * @ExceptionHandler 異常處理的註解
 */

其餘Controller經過繼承該類,也能達到全局異常處理的實現;網絡

方法三: 同 spring boot 配置mvc

1, 使用 @RestControllerAdvice 或 @ControllerAdvice 註解框架

package com.gy.spring.mvc.common.interceptor;

import com.gy.spring.mvc.common.tools.R;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.NoHandlerFoundException;

import java.io.IOException;

@RestControllerAdvice
public class ExceptionCapture {
    private Log logger = LogFactory.getLog(getClass());

    @ExceptionHandler(IOException.class)
    public R handlerIOException(Exception e) {
        logger.error(e.getMessage(), e);
        return R.err("流文件異常");
    }

    @ExceptionHandler(NoHandlerFoundException.class)
    public R handlerNoFoundException(Exception e) {
        logger.error(e.getMessage(), e);
        return R.err(404, "請求地址不存在");
    }

    @ExceptionHandler(Exception.class)
    public R handlerException(Exception e) {
        System.err.println("未知異常");
        logger.error(e.getMessage(), e);
        return R.err("未知異常");
    }

}

2, 注意該類是否已被掃描到spring容器中,若未掃描該類,聲明到容器中:ide

<bean class="com.gy.spring.mvc.common.interceptor.ExceptionCapture"/>

三種全局異常處理方法,一種經過繼承SpringMVC的異常處理來實現,一種經過異常註解來實現,兩種方式各有利弊. 咱們能夠根據項目靈活運用. 我的以爲使用 方法三 比較方便.code

相關文章
相關標籤/搜索