springmvc定义全局异常处理

方式1

使用注解,无需在springmvc里配置


package com.cft.mtj.configuration;

import java.util.List;
import java.util.Set;

import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;

import org.springframework.http.HttpStatus;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
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 com.cft.mtj.common.base.RspHeader;
import com.cft.mtj.common.exception.SysErrorCode;
import com.cft.mtj.common.exception.SysException;
import com.cft.mtj.common.exception.SysSessionErrorException;
import com.cft.mtj.common.exception.SysUnAuthorizedException;

/**
 * 
 * @class: GlobalControllerExceptionHandler
 * @title: 全局异常转换类
 * @desc: //模块目的、功能描述
 * @author: shen_antonio
 * @date: Mar 27, 2017 11:54:39 PM
 * @since: 1.0.0
 */
@ControllerAdvice
public class GlobalControllerExceptionHandler {

  /**
   * 
   * 功能描述: <br>
   * 根据特定的异常返回指定的 HTTP 状态码
   *
   * @param ex
   * @return
   * @see [相关类/方法](可选)
   * @since [产品/模块版本](可选)
   */
  @ResponseStatus(value = HttpStatus.BAD_REQUEST) // 400
  @ExceptionHandler(ConstraintViolationException.class)
  @ResponseBody
  public RspHeader handleValidationException(ConstraintViolationException ex) {
    Set<ConstraintViolation<?>> errors = ex.getConstraintViolations();
    StringBuilder strBuilder = new StringBuilder();
    for (ConstraintViolation<?> violation : errors) {
      strBuilder.append(violation.getMessage() + "\n");
    }
    RspHeader rsp = new RspHeader();
    rsp.setResultcode(SysErrorCode.VIOLATIONFAIL.getErrCode());
    rsp.setResultdesc(strBuilder.toString());
    return rsp;
  }


  /**
   * 
   * 功能描述: <br>
   * 字段校验错误异常处理
   *
   * @param ex
   * @return
   * @see [相关类/方法](可选)
   * @since [产品/模块版本](可选)
   */
  @ResponseStatus(value = HttpStatus.BAD_REQUEST) // 400
  @ExceptionHandler(MethodArgumentNotValidException.class)
  @ResponseBody
  public RspHeader handleMethodArgumentNotValidException(MethodArgumentNotValidException ex) {
    BindingResult bindingResult = ex.getBindingResult();
    StringBuffer errorMsg = new StringBuffer();
    List<FieldError> fieldErrors = bindingResult.getFieldErrors();
    for (FieldError fieldError : fieldErrors) {
      errorMsg.append(fieldError.getDefaultMessage() + " ");
    }
    RspHeader rsp = new RspHeader();
    rsp.setResultcode(SysErrorCode.VIOLATIONFAIL.getErrCode());
    rsp.setResultdesc(errorMsg.toString());
    return rsp;
  }



  /**
   * 
   * 功能描述: <br>
   * 通用异常的处理,返回500
   *
   * @param ex
   * @return
   * @see [相关类/方法](可选)
   * @since [产品/模块版本](可选)
   */
  @ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR) // 500
  @ExceptionHandler(Exception.class)
  @ResponseBody
  public RspHeader handleException(Exception ex) {
    RspHeader rsp = new RspHeader();
    rsp.setResultcode(SysErrorCode.SYSFAIL.getErrCode());
    rsp.setResultdesc(SysErrorCode.SYSFAIL.getErroDesc());
    return rsp;
  }

  /**
   * 
   * 功能描述: <br>
   * 业务异常处理,返回500
   *
   * @param ex
   * @return
   * @see [相关类/方法](可选)
   * @since [产品/模块版本](可选)
   */
  @ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR) // 500
  @ExceptionHandler(SysException.class)
  @ResponseBody
  public RspHeader handleException(SysException ex) {
    RspHeader rsp = new RspHeader();
    rsp.setResultcode(ex.getErrorCode());
    rsp.setResultdesc(ex.getDescription());
    return rsp;
  }

  /**
   * 
   * 功能描述: <br>
   * 会话超时或者不存在,返回308
   *
   * @param ex
   * @return
   * @see [相关类/方法](可选)
   * @since [产品/模块版本](可选)
   */
  @ResponseStatus(value = HttpStatus.PERMANENT_REDIRECT) // 308
  @ExceptionHandler(SysSessionErrorException.class)
  @ResponseBody
  public RspHeader handleException(SysSessionErrorException ex) {
    RspHeader rsp = new RspHeader();
    rsp.setResultcode(ex.getErrorCode());
    rsp.setResultdesc(ex.getDescription());
    return rsp;
  }

  /**
   *
   * 功能描述: <br>
   * 越权访问,返回401
   *
   * @param ex
   * @return
   * @see [相关类/方法](可选)
   * @since [产品/模块版本](可选)
   */
  @ResponseStatus(value = HttpStatus.UNAUTHORIZED) // 401
  @ExceptionHandler(SysUnAuthorizedException.class)
  @ResponseBody
  public RspHeader handleException(SysUnAuthorizedException ex){
    RspHeader rsp = new RspHeader();
    rsp.setResultcode(ex.getErrorCode());
    rsp.setResultdesc(ex.getDescription());
    return rsp;
  }



}

方式2

实现ExceptionHandlerExceptionResolver,同时还需要在springmvc内配置]

package com.cib.cap4j.core.exception;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;

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

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.multipart.MaxUploadSizeExceededException;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver;
import org.springframework.web.servlet.support.RequestContextUtils;
import org.springframework.web.servlet.view.json.MappingJackson2JsonView;

import com.cft.common.CommRspHeader;
import com.cib.cap4j.core.context.ContextUtil;

public class AnnotationHandlerMethodExceptionResolver extends ExceptionHandlerExceptionResolver {
	private Logger logger = LoggerFactory.getLogger(AnnotationHandlerMethodExceptionResolver.class);
	private String defaultErrorView;

	public String getDefaultErrorView() {
		return this.defaultErrorView;
	}

	public void setDefaultErrorView(String defaultErrorView) {
		this.defaultErrorView = defaultErrorView;
	}

	protected ModelAndView doResolveHandlerMethodException(HttpServletRequest request, HttpServletResponse response,
			HandlerMethod handlerMethod, Exception exception) {
		Locale locale = RequestContextUtils.getLocaleResolver(request).resolveLocale(request);

		String errCode = null;
		String errMsg = null;
		if (exception instanceof MapperException) {
			MapperException e = (MapperException) exception;
			errCode = e.getErrCode();
			errMsg = ContextUtil.getMessage(e.getErrCode(), e.getParams(), e.getErrCode(), locale);
		} else if (exception instanceof MaxUploadSizeExceededException) {
			errCode = "ER_FILE_ULD_001";
			Object[] params = new Object[1];
			params[0] = Long.valueOf(((MaxUploadSizeExceededException) exception).getMaxUploadSize());
			params[0] = String.valueOf(((Long) params[0]).longValue() / 1024000L);
			errMsg = ContextUtil.getMessage(errCode, params, errCode, locale);
		}
		if (errMsg == null) {
			errCode = "platform.syserror.000001";// 未知异常
			errMsg = ContextUtil.getMessage(errCode, null, errCode, locale);
		}

		Map<String,Object> rspVo = new HashMap<String,Object>();
		CommRspHeader head = new CommRspHeader();
		head.set_rd(errCode);
		head.set_rm(errMsg);
		rspVo.put("head", head);

		ModelAndView view = null;
		Method method = null;
		if (handlerMethod != null) {
			method = handlerMethod.getMethod();
		}
		if (method != null) {
			ResponseBody responseBodyAnn = (ResponseBody) AnnotationUtils.findAnnotation(method, ResponseBody.class);
			// response.setStatus(500);
			if (responseBodyAnn != null) {
				MappingJackson2JsonView jsonView = new MappingJackson2JsonView();
				view = new ModelAndView(jsonView, rspVo);
//				view.addObject(rspVo);
			}
		}
		if (view == null) {
			view = new ModelAndView();
			view.addObject("obj", rspVo);
			view.setViewName("error/error");
		}
		return view;
	}

}

springmvc内配置

	<bean id="handlerExceptionResolver"
		class="com.cib.cap4j.core.exception.AnnotationHandlerMethodExceptionResolver">
		<property name="defaultErrorView" value="error.jsp" />
		<!-- property name="messageConverters" ref="messageConverters"/ -->
	</bean>




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值