方式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>