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>
阅读全文
0 0
- springmvc定义全局异常处理
- springMVC 全局异常处理
- springMVC全局异常处理
- SpringMVC全局异常处理
- springmvc全局异常处理
- springmvc全局异常处理
- springmvc全局异常处理
- springmvc全局异常处理
- SpringMVC 全局异常处理
- springmvc全局异常处理
- SpringMVC 全局异常处理
- springMVC全局异常处理
- springMVC全局的异常处理
- springMVC实现全局异常处理
- SpringMVC 全局异常处理代码
- Springmvc的全局异常处理
- SpringMvc 中全局异常处理
- SpringMVC全局异常统一处理
- 当.emacs修改之后
- MySQL 5.7 安装完成后,立即要调整的性能选项
- python爬虫(19)爬取论坛网站——网络上常见的gif动态图
- mysql存储引擎
- Codeforces Round #442E-dfs序&线段树的区间更新区间查询-Danil and a Part-time Job
- springmvc定义全局异常处理
- Linux 制作动/静态库-LS11
- 70.设计模式笔记-命令模式
- Spring Boot & Spring MVC 异常处理的N种方法
- Kubernetes离线安装、Kubernetes二进制文件方式安装
- SDN 下用ODL实现QoS保障(5)-获取拓扑
- 七步精通Python机器学习
- boot.img的解包与打包
- Python之33个关键字详解