/** 
 | 
 * Copyright (c) 2018 人人开源 All rights reserved. 
 | 
 * 
 | 
 * https://www.renren.io 
 | 
 * 
 | 
 * 版权所有,侵权必究! 
 | 
 */ 
 | 
  
 | 
package com.zt.core.exception; 
 | 
  
 | 
import cn.hutool.core.map.MapUtil; 
 | 
import com.alibaba.fastjson.JSON; 
 | 
import com.zt.common.exception.ErrorCode; 
 | 
import com.zt.common.exception.ExceptionUtils; 
 | 
import com.zt.common.exception.RenException; 
 | 
import com.zt.common.servlet.Result; 
 | 
import com.zt.common.utils.HttpContextUtils; 
 | 
import com.zt.common.utils.IpUtils; 
 | 
import com.zt.modules.log.model.SysLogError; 
 | 
import com.zt.modules.log.service.SysLogErrorService; 
 | 
import org.slf4j.Logger; 
 | 
import org.slf4j.LoggerFactory; 
 | 
import org.springframework.beans.factory.annotation.Autowired; 
 | 
import org.springframework.dao.DuplicateKeyException; 
 | 
import org.springframework.http.HttpHeaders; 
 | 
import org.springframework.web.bind.annotation.ExceptionHandler; 
 | 
import org.springframework.web.bind.annotation.RestControllerAdvice; 
 | 
  
 | 
import javax.servlet.http.HttpServletRequest; 
 | 
import java.util.Map; 
 | 
  
 | 
/** 
 | 
 * 异常处理器 
 | 
 * 
 | 
 * @author Mark sunlightcs@gmail.com 
 | 
 * @since 1.0.0 
 | 
 */ 
 | 
@RestControllerAdvice 
 | 
public class RenExceptionHandler { 
 | 
    private static final Logger logger = LoggerFactory.getLogger(RenExceptionHandler.class); 
 | 
  
 | 
    @Autowired 
 | 
    private SysLogErrorService sysLogErrorService; 
 | 
  
 | 
    /** 
 | 
     * 处理自定义异常 
 | 
     */ 
 | 
    @ExceptionHandler(RenException.class) 
 | 
    public Result handleRenException(RenException ex) { 
 | 
        Result result = Result.ok(); 
 | 
        result = result.error(ex.getCode(), ex.getMsg()); 
 | 
  
 | 
        return result; 
 | 
    } 
 | 
  
 | 
    @ExceptionHandler(DuplicateKeyException.class) 
 | 
    public Result handleDuplicateKeyException(DuplicateKeyException ex) { 
 | 
        Result result = Result.ok(); 
 | 
        result.error(ErrorCode.DB_RECORD_EXISTS); 
 | 
  
 | 
        return result; 
 | 
    } 
 | 
  
 | 
    @ExceptionHandler(Exception.class) 
 | 
    public Result handleException(Exception ex) { 
 | 
        logger.error(ex.getMessage(), ex); 
 | 
  
 | 
        saveLog(ex); 
 | 
  
 | 
        return Result.ok().error(); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 保存异常日志 
 | 
     */ 
 | 
    private void saveLog(Exception ex) { 
 | 
        SysLogError log = new SysLogError(); 
 | 
  
 | 
        // 请求相关信息 
 | 
        HttpServletRequest request = HttpContextUtils.getHttpServletRequest(); 
 | 
        log.setIp(IpUtils.getIpAddr(request)); 
 | 
        log.setUserAgent(request.getHeader(HttpHeaders.USER_AGENT)); 
 | 
        log.setRequestUri(request.getRequestURI()); 
 | 
        log.setRequestMethod(request.getMethod()); 
 | 
        Map<String, String> params = HttpContextUtils.getParameterMap(request); 
 | 
        if (MapUtil.isNotEmpty(params)) { 
 | 
            log.setRequestParams(JSON.toJSONString(params)); 
 | 
        } 
 | 
  
 | 
        // 异常信息 
 | 
        log.setErrorInfo(ExceptionUtils.getErrorStackTrace(ex)); 
 | 
  
 | 
        // 新增 
 | 
        sysLogErrorService.insert(log); 
 | 
    } 
 | 
} 
 |