<!-- 拦截器的异常 -->
<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="com.excloud.platform.web.controller.SessionTimeoutException">redirect:/timeout.jsp</prop>
</props>
</property>
</bean>
参考: https://www.cnblogs.com/libra0920/p/6289848.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript">
alert("用户登录超时,请重新登录!");
top.location="index.jsp";
</script>
</head>
</html>
<bean id="exceptionResolver" class="com.suning.fucdn.config.DefaultHandlerExceptionResolver">
<property name="order">
<value>-1</value>
</property>
</bean>
package com.**.**.config;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import com.**.**.entity.ApiResult;
import com.**.**.entity.enums.Msg;
import com.**.**.exception.RunningException;
import com.**.**.exception.ValidationException;
import com.**.**.util.ApiUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.converter.HttpMessageConversionException;
import org.springframework.validation.BindException;
import org.springframework.web.HttpMediaTypeNotAcceptableException;
import org.springframework.web.HttpMediaTypeNotSupportedException;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.MissingServletRequestParameterException;
import org.springframework.web.bind.ServletRequestBindingException;
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.NoHandlerFoundException;
import org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver;
import org.springframework.web.servlet.mvc.multiaction.NoSuchRequestHandlingMethodException;
@Slf4j
public class DefaultHandlerExceptionResolver extends AbstractHandlerExceptionResolver {
@Override
protected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
try {
log.info("进入异常处理类DefaultHandlerExceptionResolver : " + ex);
// 404 No mapping found
// 其实spring已经在拦截器DispatcherServlet里处理了,可能是认为404错误没必要做处理消耗性能,需要重写其noHandlerFound方法。
if (ex instanceof NoSuchRequestHandlingMethodException || ex instanceof NoHandlerFoundException) {
return this.renderException(Msg.PARAMETERERROR, request, response);
// 405 Method Not Allowed
} else if (ex instanceof HttpRequestMethodNotSupportedException) {
return this.renderException(Msg.REQUESTTYPEERROR, request, response);
// 415 Content type not supported
} else if (ex instanceof HttpMediaTypeNotSupportedException) {
return this.renderException(Msg.PARAMETERERROR, request, response);
// 406 Could not find acceptable representation
} else if (ex instanceof HttpMediaTypeNotAcceptableException) {
return this.renderException(Msg.PARAMETERERROR, request, response);
// 400 Required parameter is not present
} else if (ex instanceof MissingServletRequestParameterException) {
return this.renderException(Msg.PARAMETERERROR, request, response);
// 400没有json数据 Could not read JSON: No content to map due to
// end-of-input
} else if (ex instanceof HttpMessageConversionException) {
return this.renderException(Msg.PARAMETERERROR, request, response);
// 400 Required parameter is not present
} else if (ex instanceof ServletRequestBindingException) {
return this.renderException(Msg.PARAMETERERROR, request, response);
}else if (ex instanceof MethodArgumentTypeMismatchException) {
return renderException(Msg.PARAMETERERROR, request, response);
} else if (ex instanceof BindException) {
return renderException(Msg.PARAMETERERROR, request, response);
} else {
if (ex instanceof ConstraintViolationException) {
ConstraintViolationException ce = (ConstraintViolationException) ex;
for (ConstraintViolation<?> violation : ce.getConstraintViolations()) {
Map<String, Object> attrs = violation.getConstraintDescriptor().getAttributes();
return this.renderException((Msg) (attrs.get("msg")), request, response);
}
// 自定义异常
} else if (ex instanceof ValidationException) {
ValidationException ve = (ValidationException) ex;
return this.renderException(ve.getMsg(), request, response);
} else if (ex instanceof RunningException) {
RunningException rex = (RunningException) ex;
return renderException(rex.getMsg(), request, response); // 系统异常
} else {
return this.renderException(Msg.CODEEXCEPTION, request, response);
}
}
} catch (Exception handlerException) {
log.error("", handlerException);
}
return new ModelAndView();
}
private ModelAndView renderException(Msg msg, HttpServletRequest request, HttpServletResponse response) {
ApiResult resultModel = ApiUtil.createResult(msg);
ApiUtil.setResponse(response, resultModel);
return new ModelAndView();
}
}
单元测试:
package com.**.**.config;
import com.**.**.entity.enums.Msg;
import com.**.**.exception.RunningException;
import com.**.**.exception.ValidationException;
import org.junit.Test;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConversionException;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.validation.BindException;
import org.springframework.web.HttpMediaTypeNotAcceptableException;
import org.springframework.web.HttpMediaTypeNotSupportedException;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.MissingServletRequestParameterException;
import org.springframework.web.bind.ServletRequestBindingException;
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
import org.springframework.web.servlet.NoHandlerFoundException;
import org.springframework.web.servlet.mvc.multiaction.NoSuchRequestHandlingMethodException;
import javax.validation.ConstraintViolationException;
import java.util.ArrayList;
import java.util.List;
public class DefaultHandlerExceptionResolverTest {
@Test
public void doResolveException(){
DefaultHandlerExceptionResolver defaultHandlerExceptionResolver = new DefaultHandlerExceptionResolver();
MockHttpServletRequest httpServletRequest = new MockHttpServletRequest();
MockHttpServletResponse httpServletResponse = new MockHttpServletResponse();
defaultHandlerExceptionResolver.doResolveException(httpServletRequest, httpServletResponse, null, new NoSuchRequestHandlingMethodException(httpServletRequest));
}
@Test
public void doResolveException1(){
DefaultHandlerExceptionResolver defaultHandlerExceptionResolver = new DefaultHandlerExceptionResolver();
MockHttpServletRequest httpServletRequest = new MockHttpServletRequest();
MockHttpServletResponse httpServletResponse = new MockHttpServletResponse();
defaultHandlerExceptionResolver.doResolveException(httpServletRequest, httpServletResponse, null, new NoHandlerFoundException(null, null, null));
}
@Test
public void doResolveException2(){
DefaultHandlerExceptionResolver defaultHandlerExceptionResolver = new DefaultHandlerExceptionResolver();
MockHttpServletRequest httpServletRequest = new MockHttpServletRequest();
MockHttpServletResponse httpServletResponse = new MockHttpServletResponse();
defaultHandlerExceptionResolver.doResolveException(httpServletRequest, httpServletResponse, null, new HttpRequestMethodNotSupportedException(null, null, null));
}
@Test
public void doResolveException3(){
DefaultHandlerExceptionResolver defaultHandlerExceptionResolver = new DefaultHandlerExceptionResolver();
MockHttpServletRequest httpServletRequest = new MockHttpServletRequest();
MockHttpServletResponse httpServletResponse = new MockHttpServletResponse();
List<MediaType> supportedMediaTypes = new ArrayList<>();
supportedMediaTypes.add(MediaType.APPLICATION_JSON);
defaultHandlerExceptionResolver.doResolveException(httpServletRequest, httpServletResponse, null, new HttpMediaTypeNotSupportedException(MediaType.APPLICATION_JSON_UTF8, supportedMediaTypes, Msg.CODEEXCEPTION.getValue()));
}
@Test
public void doResolveException4(){
DefaultHandlerExceptionResolver defaultHandlerExceptionResolver = new DefaultHandlerExceptionResolver();
MockHttpServletRequest httpServletRequest = new MockHttpServletRequest();
MockHttpServletResponse httpServletResponse = new MockHttpServletResponse();
defaultHandlerExceptionResolver.doResolveException(httpServletRequest, httpServletResponse, null, new HttpMediaTypeNotAcceptableException("test"));
}
@Test
public void doResolveException5(){
DefaultHandlerExceptionResolver defaultHandlerExceptionResolver = new DefaultHandlerExceptionResolver();
MockHttpServletRequest httpServletRequest = new MockHttpServletRequest();
MockHttpServletResponse httpServletResponse = new MockHttpServletResponse();
defaultHandlerExceptionResolver.doResolveException(httpServletRequest, httpServletResponse, null, new MissingServletRequestParameterException("test", "test"));
}
@Test
public void doResolveException6(){
DefaultHandlerExceptionResolver defaultHandlerExceptionResolver = new DefaultHandlerExceptionResolver();
MockHttpServletRequest httpServletRequest = new MockHttpServletRequest();
MockHttpServletResponse httpServletResponse = new MockHttpServletResponse();
defaultHandlerExceptionResolver.doResolveException(httpServletRequest, httpServletResponse, null, new HttpMessageConversionException("test", null));
}
@Test
public void doResolveException7(){
DefaultHandlerExceptionResolver defaultHandlerExceptionResolver = new DefaultHandlerExceptionResolver();
MockHttpServletRequest httpServletRequest = new MockHttpServletRequest();
MockHttpServletResponse httpServletResponse = new MockHttpServletResponse();
defaultHandlerExceptionResolver.doResolveException(httpServletRequest, httpServletResponse, null, new HttpMessageConversionException("test", null));
}
@Test
public void doResolveException8(){
DefaultHandlerExceptionResolver defaultHandlerExceptionResolver = new DefaultHandlerExceptionResolver();
MockHttpServletRequest httpServletRequest = new MockHttpServletRequest();
MockHttpServletResponse httpServletResponse = new MockHttpServletResponse();
defaultHandlerExceptionResolver.doResolveException(httpServletRequest, httpServletResponse, null, new ServletRequestBindingException("test", null));
}
@Test
public void doResolveException9(){
DefaultHandlerExceptionResolver defaultHandlerExceptionResolver = new DefaultHandlerExceptionResolver();
MockHttpServletRequest httpServletRequest = new MockHttpServletRequest();
MockHttpServletResponse httpServletResponse = new MockHttpServletResponse();
defaultHandlerExceptionResolver.doResolveException(httpServletRequest, httpServletResponse, null, new MethodArgumentTypeMismatchException(null,null,null,null, null));
}
@Test
public void doResolveException10(){
DefaultHandlerExceptionResolver defaultHandlerExceptionResolver = new DefaultHandlerExceptionResolver();
MockHttpServletRequest httpServletRequest = new MockHttpServletRequest();
MockHttpServletResponse httpServletResponse = new MockHttpServletResponse();
defaultHandlerExceptionResolver.doResolveException(httpServletRequest, httpServletResponse, null, new BindException(Msg.CODEEXCEPTION,null));
}
@Test
public void doResolveException11(){
DefaultHandlerExceptionResolver defaultHandlerExceptionResolver = new DefaultHandlerExceptionResolver();
MockHttpServletRequest httpServletRequest = new MockHttpServletRequest();
MockHttpServletResponse httpServletResponse = new MockHttpServletResponse();
defaultHandlerExceptionResolver.doResolveException(httpServletRequest, httpServletResponse, null, new ConstraintViolationException(Msg.CODEEXCEPTION.getValue(),null));
}
@Test
public void doResolveException12(){
DefaultHandlerExceptionResolver defaultHandlerExceptionResolver = new DefaultHandlerExceptionResolver();
MockHttpServletRequest httpServletRequest = new MockHttpServletRequest();
MockHttpServletResponse httpServletResponse = new MockHttpServletResponse();
defaultHandlerExceptionResolver.doResolveException(httpServletRequest, httpServletResponse, null, new ValidationException(Msg.PARAMETERERROR));
}
@Test
public void doResolveException13(){
DefaultHandlerExceptionResolver defaultHandlerExceptionResolver = new DefaultHandlerExceptionResolver();
MockHttpServletRequest httpServletRequest = new MockHttpServletRequest();
MockHttpServletResponse httpServletResponse = new MockHttpServletResponse();
defaultHandlerExceptionResolver.doResolveException(httpServletRequest, httpServletResponse, null, new RunningException(Msg.CODEEXCEPTION));
}
@Test
public void doResolveException14(){
DefaultHandlerExceptionResolver defaultHandlerExceptionResolver = new DefaultHandlerExceptionResolver();
MockHttpServletRequest httpServletRequest = new MockHttpServletRequest();
MockHttpServletResponse httpServletResponse = new MockHttpServletResponse();
defaultHandlerExceptionResolver.doResolveException(httpServletRequest, httpServletResponse, null, new IllegalAccessException(Msg.CODEEXCEPTION.getValue()));
}
}
枚举
public enum Msg {
SUCCESS(0, "success"),
CODEEXCEPTION(1, "代码异常"),
PARAMETERERROR(2, "参数错误"),
NODOMAINDATA(4, "域名列表中没有查询到相关数据"),
REQUESTTYPEERROR(3, "请求方式错误");
private Msg(Integer code, String value){
this.code = code;
this.value = value;
}
private int code;
private String value;
public int getCode() {
return code;
}
public String getValue() {
return value;
}
}
public class RunningException extends RuntimeException {
private static final long serialVersionUID = -7590728488536681021L;
/**
* 错误码
*/
private final Msg msg;
/**
* RunningException有参构造方法
* @param msg
*/
public RunningException(Msg msg){
this.msg = msg;
}
/**
* 获取错误码信息
* @return
*/
public Msg getMsg() {
return msg;
}
}
public class ApiResult {
// 错误码
private int err;
// 信息
private String msg;
// 数据
private Object data;
/**
* 设置Msg
* @param msg
*/
public ApiResult(Msg msg) {
setMsg(msg);
}
/**
* 设置Msg
* @param msg
* @param result
*/
public ApiResult(Msg msg, Object result) {
setMsg(msg);
this.data = result;
}
/**
* 设置Msg
* @param msg
*/
public void setMsg(Msg msg) {
this.err = msg.getCode();
this.msg = msg.getValue();
}
public int getErr() {
return err;
}
public void setErr(int err) {
this.err = err;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}
@Slf4j
public class ApiUtil {
private ApiUtil() {}
public static ApiResult createSuccessResult() {
return createResult(Msg.SUCCESS);
}
public static ApiResult createSuccessResult(Object data) {
return createResult(Msg.SUCCESS, data);
}
public static ApiResult createResult(Msg msg) {
return new ApiResult(msg);
}
public static ApiResult createResult(Msg msg, Object data) {
return new ApiResult(msg, data);
}
public static void setResponse(HttpServletResponse httpServletResponse, Object obj) {
String text = JSONUtil.castObjToStr(obj);
OutputStream outputStream = null;
try {
outputStream = httpServletResponse.getOutputStream();
outputStream.write(text.getBytes("UTF-8"));
} catch (Exception e) {
log.error(e.getMessage(), e);
}
httpServletResponse.setStatus(200);
httpServletResponse.setHeader("content-type", MediaType.APPLICATION_JSON_UTF8_VALUE);
}
}