1,springmvc.xml新建一个bean
<!--ID为handlerExceptionResolver 覆盖handlerExceptionResolver才会生效-->
<bean id="handlerExceptionResolver" class="com.XXX.base.exception.BusinessHandlerExceptionResolver">
<constructor-arg name="objectMapper" ref="apiObjectMapper"></constructor-arg>
</bean>
2,BusinessHandlerExceptionResolver类继承springMVC的HandlerExceptionResolver接口,重写resolveException方法
/**
* 统一异常处理
*
* @author lzf
*/
public class BusinessHandlerExceptionResolver implements HandlerExceptionResolver {
private Log log = LogFactory.getLog(BusinessHandlerExceptionResolver.class);
private ObjectMapper objectMapper;
public BusinessHandlerExceptionResolver(ObjectMapper objectMapper) {
this.objectMapper = objectMapper;
}
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
// log.error(ex.getMessage(), ex);
if (ex instanceof BusinessException) {
BusinessException exception = (BusinessException) ex;
if(StringUtil.isNotEmpty(exception.getInternalMsg()))
log.error(exception.getInternalMsg(), exception);
JSONUtil.writerHttpMsg(getObjectMapper(), NotDataResult.Failed(ex.getMessage()), response);
} else if (ex instanceof NotLoginException) {
DataResult<Object> notLogin = NotDataResult.NotLogin();
if (StringUtil.isNotEmpty(ex.getMessage()))
notLogin.setMsg(ex.getMessage());
JSONUtil.writerHttpMsg(getObjectMapper(), notLogin, response);
} else {
//ExceptionUtils.getStackTrace(ex)
JSONUtil.writerHttpMsg(getObjectMapper(), NotDataResult.Busy(), response);
log.error(ex.getMessage(), ex);
}
return null;
}
public ObjectMapper getObjectMapper() {
return objectMapper;
}
}
3,新建业务错误类
/**
* 业务错误
* @author lzf
*/
public class BusinessException extends RuntimeException {
private String internalMsg;
private static final long serialVersionUID = -1388490148739046763L;
/**
* @param businessMsg 用户看的业务消息
*/
public BusinessException(String businessMsg) {
super(businessMsg);
}
/**
* @param businessMsg 用户看的业务消息
* @param internalMsg 内部调试看的实际信息
*/
public BusinessException(String businessMsg, String internalMsg){
super(businessMsg);
this.internalMsg = internalMsg;
}
/**
* 获取内部消息
* @return
*/
public String getInternalMsg() {
return internalMsg;
}
}