统一异常处理
异常最后都会一层一层往上抛,所以我们只要在表现层就能处理全部异常。
只要按照下面的规则,springboot会自动跳转,不需要任何代码注解
规则
1.error目录必须在templates下面,且名字必须为error
2.目录下的名字,必须为错误码。如404.html。
只要输入不存在的地址,就会报404自动跳转到404.html
但是这只是表面处理,不能符合预期。比如报500,应该记录日志啥的。
所有controller下面的方法,只要报异常了,就会记录日志
package com.cjh.community.controller.advice;
import com.cjh.community.util.CommunityUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* @Description:
* @Author: cjh
* @data: Version 1.0
*/
/**
* 这个组件会扫描所有bean,范围太大,我们要限制。只要限制controller注解就行
*/
@ControllerAdvice(annotations = Controller.class)
public class ExceptionAdvice {
private static final Logger logger = LoggerFactory.getLogger(ExceptionAdvice.class);
/**
* Exception.class处理所有异常
*/
@ExceptionHandler({Exception.class})
public void handleException(Exception e, HttpServletRequest request, HttpServletResponse response) throws IOException {
logger.error("服务器发送异常:"+e.getMessage());
//获取所有异常信息。上面的message只是概括信息。下面的才是详细信息
for (StackTraceElement stackTraceElement : e.getStackTrace()) {
logger.error(stackTraceElement.toString());
}
//请求也分两种,一种可以返回html的普通请求 2.异步请求,返回json或xml
String header = request.getHeader("x-requested-with");
//这就说明是异步请求
if ("XMLHttpRequest".equals(header)){
//application/json 表示想浏览器返回json,浏览器自动转js对象
//application/plain 表示返回普通字符串,可以是json xml,浏览器不会自动转,需要手动$jsonPares
response.setContentType("application/plain;charset=utf-8");
PrintWriter writer = response.getWriter();
writer.write(CommunityUtil.getJSONString(1,"服务器异常"));
}else{
response.sendRedirect(request.getContextPath() + "/error");
}
}
}