1、自定义异常类
package com.smc.exception;
import com.smc.constants.Constants;
/**
*
* @ClassName: BusinessException
* @description: 业务自定义异常
* @author liuxk
* @version V1.0
*/
public class BusinessException extends RuntimeException{
private static final long serialVersionUID = -778223413321636516L;
private Integer code;
private String msg;
private Throwable exception;
public BusinessException(String msg) {
super(msg);
this.code=Constants.HTTP_RES_CODE_500;
this.msg=msg;
}
public BusinessException(Integer code,String msg) {
super(msg);
this.code=code;
this.msg=msg;
}
public BusinessException(String msg, Throwable e) {
super(msg,e);
this.code=Constants.HTTP_RES_CODE_500;
this.msg = msg;
this.exception = e;
}
public BusinessException(Integer code,String msg, Throwable e) {
super(msg,e);
this.code=code;
this.msg = msg;
this.exception = e;
}
public Integer getCode() {
return code;
}
public String getMsg() {
return msg;
}
public Throwable getException() {
return exception;
}
}
2、自定义异常使用
String token="";
if(StringUtil.isEmpty(token)) {
throw new BusinessException(">>>>>>>>自定义异常处理");
}
3、全局异常处理类
package com.smc.aop.error;
import java.util.Date;
import java.util.List;
import javax.annotation.Resource;
import javax.jms.Queue;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.validation.BindException;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import com.alibaba.fastjson.JSONObject;
import com.smc.exception.BusinessException;
import com.smc.mqlog.producer.MessageProducer;
import lombok.extern.slf4j.Slf4j;
/**
*
* @ClassName: GlobalExceptionHandler
* @description: 全局捕获异常
* @author liuxk
* @version V1.0
*/
@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
@Autowired
private MessageProducer<JSONObject> messageProducer;
@Resource(name = "mqexception")
private Queue mqexception;
@Autowired
private ThreadPoolTaskExecutor threadPoolTaskExecutor;
/**
* 运行时异常
* @param request
* @param e
* @return
*/
@ExceptionHandler(RuntimeException.class)
@ResponseBody
public JSONObject exceptionHandler(HttpServletRequest request,Exception ex) {
log.error("###全局捕获异常###,RuntimeException api:{}, errcode:{}, msg:{}", request.getRequestURI(), 500, ex.getMessage());
log.error("###全局捕获异常###,RuntimeException ", ex);
JSONObject errorJson = new JSONObject();
JSONObject logJson = new JSONObject();
String LogGlobalKey=request.getHeader("LogGlobalKey");
logJson.put("log_global_key", LogGlobalKey);
logJson.put("opt_user", "0000a6acc784464180228eeb1761c48c");
// 请求时间
logJson.put("request_time", new Date());
// 请求URL
logJson.put("request_url", request.getRequestURL().toString());
// 错误内容
logJson.put("error_content", ex.getCause()+"###"+ex.getMessage());
errorJson.put("request_error", logJson);
//发送消息到activeMQ
// messageProducer.sendMessage(mqexception,errorJson);
threadPoolTaskExecutor.execute(new LogThread(mqexception,errorJson));
JSONObject result = new JSONObject(true);
result.put("code", 500);
result.put("msg", "系统错误");
result.put("data", null);
result.put("exception", ex.getCause());
return result;
}
/**
* 业务自定义异常
* @param request
* @param e
* @return
*/
@ExceptionHandler(BusinessException.class)
@ResponseBody
public JSONObject handleBusinessException(HttpServletRequest request,Exception ex) {
log.error("###全局捕获异常###,BusinessException api:{}, errcode:{}, msg:{}", request.getRequestURI(), 500, ex.getMessage());
log.error("###全局捕获异常###,BusinessException ", ex);
BusinessException businessException=(BusinessException) ex;
JSONObject errorJson = new JSONObject();
JSONObject logJson = new JSONObject();
String LogGlobalKey=request.getHeader("LogGlobalKey");
logJson.put("log_global_key", LogGlobalKey);
logJson.put("opt_user", "0000a6acc784464180228eeb1761c48c");
// 请求时间
logJson.put("request_time", new Date());
// 请求URL
logJson.put("request_url", request.getRequestURL().toString());
// 错误内容
logJson.put("error_content", ex.getCause()+"###"+ex.getMessage());
errorJson.put("request_error", logJson);
//发送消息到activeMQ
// messageProducer.sendMessage(mqexception,errorJson);
threadPoolTaskExecutor.execute(new LogThread(mqexception,errorJson));
JSONObject result = new JSONObject(true);
result.put("code", businessException.getCode());
result.put("msg", businessException.getMsg());
result.put("data", null);
result.put("exception", businessException.getException());
return result;
}
/**
* 参数绑定异常
* @param request
* @param ex
* @return
*/
@ExceptionHandler(BindException.class)
@ResponseBody
public JSONObject handleBindException(HttpServletRequest request, Exception ex) {
org.springframework.validation.BindException c = (org.springframework.validation.BindException) ex;
List<ObjectError> errors = c.getBindingResult().getAllErrors();
StringBuffer errorMsg = new StringBuffer();
errors.stream().forEach(x -> errorMsg.append(x.getDefaultMessage()).append(";"));
log.error(" beanValidator 校验未通过 api:{}, errcode:{}, msg:{}",
request.getRequestURI(), 500, errorMsg.toString());
log.error(" beanValidator 校验未通过 ", ex);
JSONObject errorJson = new JSONObject();
JSONObject logJson = new JSONObject();
String LogGlobalKey=request.getHeader("LogGlobalKey");
logJson.put("log_global_key", LogGlobalKey);
logJson.put("opt_user", "0000a6acc784464180228eeb1761c48c");
// 请求时间
logJson.put("request_time", new Date());
// 请求URL
logJson.put("request_url", request.getRequestURL().toString());
// 错误内容
logJson.put("error_content", ex.getCause()+"###"+ex.getMessage());
errorJson.put("request_error", logJson);
//发送消息到activeMQ
// messageProducer.sendMessage(mqexception,errorJson);
threadPoolTaskExecutor.execute(new LogThread(mqexception,errorJson));
JSONObject result = new JSONObject(true);
result.put("code", 500);
result.put("msg", errorMsg.toString());
result.put("data", null);
result.put("exception", ex.getCause());
return result;
}
/**
* 未知异常
* @param request
* @param ex
* @return
*/
@ExceptionHandler(Exception.class)
@ResponseBody
public JSONObject handleException(HttpServletRequest request, Exception ex) {
log.error("###全局捕获异常###,Exception api:{}, errcode:{}, msg:{}",
request.getRequestURI(), 500, "内部错误", ex.getMessage());
log.error("###全局捕获异常###,Exception ", ex);
JSONObject errorJson = new JSONObject();
JSONObject logJson = new JSONObject();
String LogGlobalKey=request.getHeader("LogGlobalKey");
logJson.put("log_global_key", LogGlobalKey);
logJson.put("opt_user", "0000a6acc784464180228eeb1761c48c");
// 请求时间
logJson.put("request_time", new Date());
// 请求URL
logJson.put("request_url", request.getRequestURL().toString());
// 错误内容
logJson.put("error_content", ex.getCause()+"###"+ex.getMessage());
errorJson.put("request_error", logJson);
//发送消息到activeMQ
// messageProducer.sendMessage(mqexception,errorJson);
threadPoolTaskExecutor.execute(new LogThread(mqexception,errorJson));
JSONObject result = new JSONObject(true);
result.put("code", 500);
result.put("msg", "系统错误");
result.put("data", null);
result.put("exception", ex.getCause());
return result;
}
/**
* 使用多线程写入日志目的:加快响应 提高程序效率 使用线程池维护线程
*/
class LogThread implements Runnable {
private Queue mq;
private JSONObject myJson;
public LogThread(Queue mqexception, JSONObject myJson) {
this.mq = mqexception;
this.myJson = myJson;
}
@Override
public void run() {
log.info(">>>>>aop log error>>>>>step into Asynchronous Thread Call>>>>");
messageProducer.sendMessage(mq,myJson);
log.info(">>>>>aop log error>>>>>Asynchronous Thread Call Over>>>>");
}
}
}