一、springboot Restful使用@ControllerAdvice、@ExceptionHandler、@ResponseBody实现全局异常处理
@ControllerAdvice 注解定义全局异常处理类
@ExceptionHandler 指定自定义错误处理方法拦截的异常类型
同一个异常被小范围的异常类和大范围的异常处理器同时覆盖,会选择小范围的异常处理器
1.定义异常业务类
/*** 异常VO** @date 2017年2月17日* @since 1.0.0*/public class ExceptionVO {private String errorCode;private String message;public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public String getErrorCode() {return errorCode;}public void setErrorCode(String errorCode) {this.errorCode = errorCode;}}
2.定义自定义异常
package exception;/*** 无数据Exception** @date 17/4/25* @since 1.0.0*/public class NotFoundException extends SystemException {public NotFoundException(String message) {super(message);}}/*** 系统异常** @date 2017年2月12日* @since 1.0.0*/public class SystemException extends RuntimeException {private static final long serialVersionUID = 1095242212086237834L;protected Object errorCode;protected Object[] args;public SystemException() {super();}public SystemException(String message, Throwable cause) {super(message, cause);}public SystemException(String message) {super(message);}public SystemException(String message, Object[] args, Throwable cause) {super(message, cause);this.args = args;}public SystemException(String message, Object[] args) {super(message);this.args = args;}public SystemException(Object errorCode, String message, Throwable cause) {super(message, cause);this.errorCode = errorCode;}public SystemException(Object errorCode, String message) {super(message);this.errorCode = errorCode;}public SystemException(Object errorCode, String message, Object[] args, Throwable cause) {super(message, cause);this.args = args;this.errorCode = errorCode;}public SystemException(Object errorCode, String message, Object[] args) {super(message);this.args = args;this.errorCode = errorCode;}public SystemException(Throwable cause) {super(cause);}public Object[] getArgs() {return args;}public Object getErrorCode() {return errorCode;}}
3.定义全局异常处理类
import java.util.HashMap;import java.util.Map;import java.util.stream.Collectors;import NotFoundException;import org.apache.commons.collections.CollectionUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.MessageSource;import org.springframework.context.NoSuchMessageException;import org.springframework.context.i18n.LocaleContextHolder;import org.springframework.http.HttpStatus;import org.springframework.validation.BindException;import org.springframework.validation.FieldError;import org.springframework.web.bind.annotation.ControllerAdvice;import org.springframework.web.bind.annotation.ExceptionHandler;import org.springframework.web.bind.annotation.ResponseBody;import org.springframework.web.bind.annotation.ResponseStatus;import ExceptionVO;/*** WEB异常处理器** @date 2017年2月16日* @since 1.0.0*/@ControllerAdvice("web") //指定异常处理期拦截范围public class WebExceptionHandler {static Logger LOG = LoggerFactory.getLogger(WebExceptionHandler.class);@Autowiredprivate MessageSource messageSource;@ExceptionHandler(FieldException.class)@ResponseStatus(HttpStatus.CONFLICT) //指定http响应状态@ResponseBody/*** 未找到数据** @param e* @return*/@ExceptionHandler(NotFoundException.class)//指定异常类型@ResponseStatus(HttpStatus.NOT_FOUND)@ResponseBodypublic ExceptionVO handleNotFoundException(NotFoundException e) {ExceptionVO vo = new ExceptionVO();fillExceptionVO(e, vo);return vo;}@ExceptionHandler(SystemException.class)@ResponseStatus(HttpStatus.CONFLICT)@ResponseBodypublic ExceptionVO handleSystemException(SystemException e) {ExceptionVO vo = new ExceptionVO();fillExceptionVO(e, vo);return vo;}@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)@ExceptionHandler(Exception.class)public void globalError(Exception e) {LOG.error(e.getMessage(), e);}/*** 填充异常响应消息** @param e* @param vo*/private void fillExceptionVO(SystemException e, ExceptionVO vo) {if (e.getMessage() != null) {String message = e.getMessage();try {message = messageSource.getMessage(e.getMessage(), e.getArgs(), LocaleContextHolder.getLocale());} catch (NoSuchMessageException ex) {; // ignore}vo.setMessage(message);}vo.setErrorCode(String.valueOf(e.getErrorCode()));}}
二、springboot 返回 ModelAndView
package exception.handler;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.web.servlet.HandlerExceptionResolver;import org.springframework.web.servlet.ModelAndView;@Commpentpublic class OverallExceptionHandler implements HandlerExceptionResolver {@Overridepublic ModelAndView resolveException(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2,Exception ex) {ModelAndView mav = new ModelAndView();System.out.println(ex.getMessage());mav.addObject("errMsg", ex.getMessage());mav.setViewName("error");return mav;}}
其它方式:
@ControllerAdvicepublic class GlobalExceptionHandler {@ExceptionHandler(value = Exception.class)public ModelAndView resolveException(HttpServletRequest request, Exception ex) throws Exception {ModelAndView mav = new ModelAndView();System.out.println(ex.getMessage());mav.addObject("errMsg", ex.getMessage());mav.setViewName("error");return mav;}}
