SSM整合 – 异常映射
创建自定义异常
继承RuntimeException并调用构造器
public class LoginFailedException extends RuntimeException{
public LoginFailedException () {
}
public LoginFailedException (String message) {
super(message);
}
public LoginFailedException (String message, Throwable cause) {
super(message, cause);
}
public LoginFailedException (Throwable cause) {
super(cause);
}
public LoginFailedException (String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}
通过注解异常映射
// @ControllerAdvice表示当前类是一个基于注解的异常处理器类
@ControllerAdvice
public class CrowdExceptionResolver {
@ExceptionHandler(value = LoginFailedException .class)
public ModelAndView resolveLoginException(
LoginFailedException exception,
HttpServletRequest request,
HttpServletResponse response
) throws IOException {
String viewName = "login";
return commonResolve(viewName, exception, request, response);
}
// @ExceptionHandler将一个具体的异常类型和一个方法关联起来
private ModelAndView commonResolve(
// 异常处理完成后要去的页面
String viewName,
// 实际捕获到的异常类型
Exception exception,
// 当前请求对象
HttpServletRequest request,
// 当前响应对象
HttpServletResponse response) throws IOException {
// 1.判断当前请求类型
boolean judgeResult = CrowdUtil.judgeRequestType(request);
// 2.如果是Ajax请求
if(judgeResult) {
// 3.创建ResultEntity对象
AjaxResult<Object> resultEntity = AjaxResult.failed(exception.getMessage());
// 4.创建Gson对象
Gson gson = new Gson();
// 5.将ResultEntity对象转换为JSON字符串
String json = gson.toJson(resultEntity);
// 6.将JSON字符串作为响应体返回给浏览器
response.getWriter().write(json);
// 7.由于上面已经通过原生的response对象返回了响应,所以不提供ModelAndView对象
return null;
}
// 8.如果不是Ajax请求则创建ModelAndView对象
ModelAndView modelAndView = new ModelAndView();
// 9.将Exception对象存入模型
modelAndView.addObject("exception", exception);
// 10.设置对应的视图名称
modelAndView.setViewName(viewName);
// 11.返回modelAndView对象
return modelAndView;
}
}
判断是否Ajax请求工具类
public class CrowdUtil {
/**
* 判断是否为Ajax请求
*
* @param request
* @return
*/
public static boolean judgeRequestType(HttpServletRequest request) {
// 1.获取消息头
String acceptHeader = request.getHeader("Accept");
String xRequestHeader = request.getHeader("X-Requested-With");
return (
(acceptHeader != null && acceptHeader.contains("application/json"))
||
(xRequestHeader != null && xRequestHeader.equals("XMLHttpRequest"))
);
}
}
通过XML异常映射
<!-- 配置XML异常映射 -->
<bean id="SimpleMappingExceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="java.lang.Exception">system-error</prop>
</props>
</property>
</bean>