qingjiuquan 2020-07-19
统一管理项目中的异常
抛出异常
显示异常
普通请求:在页面上显示异常信息
Ajax请求:返回json数据

服务器接收到用户请求过程中,如果有异常则抛出异常,SpringMVC的异常映射机制则会判断请求的类型从而响应不同的异常映射请求.

/**
* @Description 判断请求是ajax还是普通请求
*/
public class CrowdUtil {
/**
* 判断请求是否是ajax请求
* @param request
* @return
*/
public static boolean isAjaxRequest(HttpServletRequest request) {
String accept = request.getHeader("Accept");
String xRequestHeader = request.getHeader("X-Requested-With");
return ((accept!=null && accept.contains("application/json")) || (xRequestHeader != null && xRequestHeader.equals("XMLHttpRequest")));
}
}基于xml
步骤:
<!--异常映射-->
<bean id="simpleMappingExceptionResolver"
class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!--指定异常类型和逻辑视图名称的对应关系-->
<property name="exceptionMappings">
<props>
<!--
key表示异常类型
value表示映射的视图界面
-->
<prop key="java.lang.Exception">system-error</prop>
</props>
</property>
<!--使用exceptionAttribute可以修改异常对象存入请求域时使用的属性名-->
<!--<property name="exceptionAttribute"></property>-->
</bean>然后指定映射的jsp页面即可.
基于注解
// @ControllerAdvice,表示这是一个基于注解的 异常处理类
@ControllerAdvice
public class ExceptionResolver {
// @ExceptionHandler 建立异常和类的映射关系
@ExceptionHandler(value = ArithmeticException.class)
public ModelAndView resolverException(ArithmeticException e, HttpServletRequest request, HttpServletResponse response) throws IOException {
// 判断请求的类型
boolean requestType = CrowdUtil.isAjaxRequest(request);
// 如果是ajax请求
if (requestType) {
// 创建ResultEntity
ResultEntity<Object> failed = ResultEntity.failed(e.getMessage());
// 创建Gson
Gson gson = new Gson();
// 将ResultEntity转为json
String json = gson.toJson(failed);
// 将json数据返还给浏览器
response.getWriter().write(json);
// 因为使用了原生respones对象返回了响应,不提供ModelAndView对象
return null;
} else {
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("exception", e);
modelAndView.setViewName("system-error");
return modelAndView;
}
}
/**
* 提取可复用部分
*
* @return
*/
public ModelAndView common(String viewName, Exception e, HttpServletRequest request, HttpServletResponse response) throws IOException {
boolean requestType = CrowdUtil.isAjaxRequest(request);
if (requestType) {
ResultEntity<Object> failed = ResultEntity.failed(e.getMessage());
String json = new Gson().toJson(failed);
response.getWriter().write(json);
return null;
} else {
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("exception", e);
modelAndView.setViewName(viewName);
return modelAndView;
}
}
@ExceptionHandler(LoginFailedException.class)
public ModelAndView resolverLoginFailedException(LoginFailedException e, HttpServletRequest request, HttpServletResponse response) throws IOException {
String viewName = "/ad-login";
ModelAndView modelAndView = common(viewName, e, request, response);
return modelAndView;
}
@ExceptionHandler(AccessForbidenException.class)
public ModelAndView resolverAccessForbiddenException(AccessForbidenException e, HttpServletRequest request, HttpServletResponse response) throws IOException {
String viewName = "/ad-login";
ModelAndView modelAndView = common(viewName, e, request, response);
return modelAndView;
}
@ExceptionHandler(LoginAccountAlreadlyInUse.class)
public ModelAndView resolverLoginAccountAlreadlyInUseException(LoginAccountAlreadlyInUse e, HttpServletRequest request, HttpServletResponse response) throws IOException {
String viewName = "/add";
ModelAndView modelAndView = common(viewName, e, request, response);
return modelAndView;
}
@ExceptionHandler(LoginAccountAlreadlyInUseForUpdate.class)
public ModelAndView resolverLoginAccountAlreadlyInUseForUpdateException(LoginAccountAlreadlyInUseForUpdate e, HttpServletRequest request, HttpServletResponse response) throws IOException {
String viewName = "system-error";
ModelAndView modelAndView = common(viewName, e, request, response);
return modelAndView;
}
}