springmvc 全局异常ControllerAdviceExceptionHandler

Posted 猩猩之火

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springmvc 全局异常ControllerAdviceExceptionHandler相关的知识,希望对你有一定的参考价值。

springmvc框架采用的是统一、全局的异常处理。把controller中的所有异常处理都集中到一个地方。采用的是AOP的思想、把业务逻辑和异常处理代码分开,降低耦合。Springmvc中的异常处理主要用到以下两个注解@ControllerAdvice和@ExceptionHandler。

1、自定义1个异常类。

public class LzsException extends RuntimeException 

	private static final long serialVersionUID = 9053285379587890690L;

	protected int errCode;
	protected String errMsg;
	protected Throwable errCause;
	
	public LzsException() 
		super();
	

	public LzsException(String errMsg) 
		super(errMsg);
		this.errMsg = errMsg;
	

	public LzsException(Throwable errCause) 
		super(errCause);
		this.errCause = errCause;
	

	public LzsException(String errMsg, Throwable errCause) 
		super(errMsg,errCause);
		this.errMsg = errMsg;
		this.errCause = errCause;
	

	public LzsException(int errCode, Throwable errCause) 
		super();
		this.errCode = errCode;
		this.errCause = errCause;
	
	

2、定义个普通类,作为全局异常处理类

@ControllerAdvice
public class GlobalExceptionHandler 

    private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    @ExceptionHandler(Exception.class)
    @ResponseBody
    public HttpJsonResponse exceptionHandler(Exception e)
        log.error("Exception:",e.getMessage());
        HttpJsonResponse result = new HttpJsonResponse();
        result.setCode(ResponseConst.ErrorCode.ERR_999);
        result.setMessage("服务器内部错误,请联系管理员");
        return result;
    

    @ExceptionHandler(LzsException.class)
    @ResponseBody
    public HttpJsonResponse lzsExceptionHandler(Exception e)
        log.error("LzsException异常:",e.getMessage());
        HttpJsonResponse result = new HttpJsonResponse();
        result.setCode(ResponseConst.ErrorCode.ERR_999);
        result.setMessage(e.getMessage());
        //1可以吧异常信息记录下来保存到数据库,
        //2发送通知,把异常信息通过邮件,短信,微信发给相关人员。
        //3返回前端友好提示
        return result;
    

3、通过Controller调用service层业务接口,service层抛出异常:

if (CollectionUtils.isEmpty(unionIdList)) 
			throw new LzsException("请联系管理员设置xxx");
		

4、如果没起作用,可以排查以下两个方便。

        4.1检查是否在配置文件application.xml里有这样的配置,如果没有需要加上:

<mvc:annotation-driven />
<context:component-scan base-package="com.lzs" />

        4.2 检查controller层是否加了try...catch  .有则去掉

以上是关于springmvc 全局异常ControllerAdviceExceptionHandler的主要内容,如果未能解决你的问题,请参考以下文章

SpringMVC的全局异常处理

SpringMVC--全局异常处理

springMVC全局Exception异常处理SimpleMappingExceptionResolver

springmvc学习笔记(16)-异常处理器

SpringMvc,Springboot统一校验自定义异常全局异常处理

SpringMvc,Springboot统一校验自定义异常全局异常处理