在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