在application中的exception中,定义了一个BmsExceptionHandler类
代码如下:
package com.jiujie.jmUniversity.application.exception;
import com.jiujie.framework.adapter.vo.ResponseResult;
import com.jiujie.framework.base.utils.JSONUtils;
import com.jiujie.framework.base.utils.StringUtils;
import com.jiujie.framework.exception.BusinessException;
import org.apache.shiro.authz.UnauthorizedException;
import org.apache.shiro.session.StoppedSessionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* BmsExceptionHandler
* @author zhouyw
* @date 2017.08.22
*/
@ControllerAdvice
/*@ControllerAdvice,是Spring3.2提供的新注解,它是一个Controller增强器,
这里就用到了AOP思想,如果每个方法都throw Exception,那么如果每个方法
都去对异常进行处理,那么代码重复,可以把异常处理抽出来,通过Aop来进行织入
*/
public class BmsExceptionHandler {
private Logger logger = LoggerFactory.getLogger(getClass());
/**
* biz
* @param e
* @return
*/
@ExceptionHandler(value = BusinessException.class)
public String bizErrorHandler(HttpServletRequest request, HttpServletResponse response, BusinessException e, Model model) throws IOException {
logger.error("biz error-->e={}", e.getMessage(), e);
return errorHandler(request, response, e, model);
}
/**
* 权限未受权
* @param e
* @return
*/
@ExceptionHandler(value = UnauthorizedException.class)
@ResponseBody
public ResponseResult unauthorizedErrorHandler(UnauthorizedException e) {
logger.error("当前登录用户没有该权限", e);
ResponseResult responseResult = new ResponseResult();
responseResult.setSuccess(false);
responseResult.setMessage("当前登录用户没有该权限");
return responseResult;
}
/**
* 用户Session会话停止
* @param e
*/
@ExceptionHandler(value = StoppedSessionException.class)
@ResponseBody
public void stoppedSessionErrorHandler(StoppedSessionException e) {
String errorMsg = "当前登录用户Session会话停止";
if (StringUtils.isNotEmpty(e.getMessage())) {
errorMsg = e.getMessage();
}
logger.error(errorMsg, e);
}
/**
* voExt 空指针异常
* @param request
* @param response
* @param e
* @param model
* @return
* @throws IOException
*/
@ExceptionHandler(value = HttpMessageNotWritableException.class)
public String httpMessageNotWritableExceptionHandler(HttpServletRequest request, HttpServletResponse response,
HttpMessageNotWritableException e, Model model) throws IOException {
logger.error("http error-->e={}", e.getMessage(), e);
return errorHandler(request, response, e, model);
}
private String errorHandler(HttpServletRequest request, HttpServletResponse response, RuntimeException e, Model model) throws IOException {
System.out.println("contentType: " + request.getContentType());
if ("XMLHttpRequest".equalsIgnoreCase(request.getHeader("X-Requested-With")) ||
request.getContentType().contains("multipart/form-data")) {
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
PrintWriter out = response.getWriter();
out.println(JSONUtils.objectToString(new ResponseResult(false, null, e.getMessage())));
out.flush();
return "";
} else {
//非ajax请求时,session失效的处理
model.addAttribute("errMsg",e.getMessage());
return "error";
}
}
}