springmvc定义全局异常处理

来源:互联网 发布:英语视频翻译软件 编辑:程序博客网 时间:2024/05/01 11:49

方式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 */@ControllerAdvicepublic 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>




原创粉丝点击