SpringBoot 統一返回,統一日誌處理

package com.shuidi.aop;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import com.shuidi.common.util.LoggerUtil;
/**
 * Aop統一日誌管理
 * @author 李修睿
 * @Date 2019年8月22日
 */
@Aspect
@Component
public class LogResult {
    /**
     * 保存信息到當前線程
     */
     public static final ThreadLocal<Map<String,String>> INFO=new ThreadLocal<>();
    Logger log = LoggerUtil.getLogger(LogResult.class);
    
    @Pointcut("execution(public * com.shuidi.*.controller.*.*(..))")
    public void webLog(){
        
    } 
    /**
     * 日誌記錄請求內容
     * @param joinPoint
     * @throws Throwable
     * 2020年2月6日 上午10:40:16
     */
    @Before("webLog()")
    public void doBefore(JoinPoint joinPoint) throws Throwable {
        // 接收到請求,記錄請求內容
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        
        Signature signature = joinPoint.getSignature();
//        MethodSignature methodSignature = (MethodSignature) signature;
//        String[] names = methodSignature.getParameterNames();
//        Object[]  args = joinPoint.getArgs();
      

        String method=  signature.getDeclaringTypeName() + "." +signature.getName();
        String args=Arrays.toString(joinPoint.getArgs());
        
        Map<String, String> map = new HashMap<String, String>();
        map.put("method", method);
        map.put("args", args);
        INFO.set(map);
        // 記錄下請求內容
        log.info("URL : " +  request.getRequestURL().toString());
        log.info("HTTP_METHOD : " + request.getMethod());
        log.info("IP : " + request.getRemoteAddr());
        log.info("CLASS_METHOD : " +method);
        log.info("ARGS : " + args);
 
    }

    
    /**
     * 日誌記錄返回結果
     * @param ret
     * @throws Throwable
     */
    @AfterReturning(returning = "ret", pointcut = "webLog()")
    public void doAfterReturning(Object ret) throws Throwable {
        INFO.remove();
        // 處理完請求,返回內容
        if(null==ret){
             log.info("返回結果 : null" );
        }else{
              log.info("返回結果 : " +ret.toString() );
        }
      
      
    }


}
 

 

package com.shuidi.common.result;

import com.alibaba.fastjson.JSON;

/**
 * 統一返回模型
 * @author 李修睿
 * @Date 2019年8月22日
 * @param <T>
 */
public class Result<T> {
    
       private int code;
       private String message;
       private T datas;
    
    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }
    
    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
    
    public T getDatas() {
        return datas;
    }

    public void setDatas(T datas) {
        this.datas = datas;
    }

    
    public String toString(){
        return JSON.toJSONString(this);
    }
}
 

 

 

package com.shuidi.common.result;

import java.util.List;

import com.shuidi.common.myException.CustomException;

public class ResultUtil{
    public static final String CODE_REDBAG_CANT_BUY = "-1";
    public static final int CODE_SUCCESS = 1;
    
    public static final int CODE_FAIL = -1;    
    public static final int CODE_NULL = 0;    
    
    public static final String MSG_SUCCESS = "成功";

    public static final String MSG_FAIL = "失敗";
    public static final String MSG_NULL = "無記錄";
    
    public static final String MSG_ERROR = "未知錯誤";

    public static final int DB_RETURN_FAIL = 0;
    /**
     * 正常返回
     * @param t
     * @return
     */
    public static <T> Result<T> out(T t){    
        
        Result<T> res = new Result<>();
        if(null==t){
            res.setCode(CODE_NULL);
            res.setMessage(MSG_NULL);
        }else if(t instanceof List){
            if(((List<?>) t).isEmpty()){
                res.setCode(CODE_NULL);
                res.setMessage(MSG_NULL);
            }else{
                res.setCode(CODE_SUCCESS);
                res.setMessage(MSG_SUCCESS);
            }
        }else{
            res.setCode(CODE_SUCCESS);
            res.setMessage(MSG_SUCCESS);
        }
        
        res.setDatas(t);
        return res;
    }
    /**
     * 返回int
     * @param t
     * @return
     */
    public static  Result<Integer> out(int t){    
    
        Result<Integer> res = new Result<>();
        if(t<1){
            res.setCode(CODE_NULL);
            res.setMessage(MSG_FAIL);
        }else{
            res.setCode(CODE_SUCCESS);
            res.setMessage(MSG_SUCCESS);
        }
        res.setDatas(t);
        return res;
    }
    /**
     * 返回Sring
     * @param t
     * @return
     */
    public static  Result<String> out(String t){
        Result<String> res = new Result<>();
        if(null==t||"".equals(t)){
            res.setCode(CODE_NULL);
            res.setMessage(MSG_FAIL);
        }else{
            res.setCode(CODE_SUCCESS);
            res.setMessage(MSG_SUCCESS);
        }
        res.setDatas(t);
        return res;
    }
    /**
     * 返回對象
     * @param t
     * @return
     */
    public static <T> Result<T> out(T t,int code ,String msg){
        Result<T> res = new Result<>();
        res.setCode(code);
        res.setMessage(msg);
        res.setDatas(t);
        return res;
    }    
    /**
     * 返回異常
     * @param t
     * @return
     */
    public static  <T> Result<T> outError(T t){
        Result<T> res = new Result<>();
        if(t instanceof CustomException){//返回自定義異常
            CustomException c =( CustomException)t;
            res.setCode(c.getCode());
            res.setMessage(c.getMessage());
        }else{//返回系統異常
            res.setCode(CODE_FAIL);
            res.setMessage(MSG_ERROR);
        }
        return res;
    }
    

}
 

 

package com.shuidi.exceptionhandler;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import com.shuidi.aop.LogResult;
import com.shuidi.common.myException.CustomException;
import com.shuidi.common.result.Result;
import com.shuidi.common.result.ResultUtil;
 
/**
 * controller 增強器
 *
 * @author sam
 * @since 2017/7/17
 */
@ControllerAdvice
public class MyControllerAdvice {
    private static final Logger log= LoggerFactory.getLogger(MyControllerAdvice.class);
    /**
     * 全局異常捕捉處理
     * @param ex
     * @return
     */
    @ResponseBody
    @ExceptionHandler(value = Exception.class)
    public Result<Exception> errorHandler(Exception ex) {
        HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
        log.error("URL:"+request.getRequestURI());
        log.error("HTTP_METHOD : " + request.getMethod());
        log.error("IP : " + request.getRemoteAddr());
        Map<String, String> map = LogResult.INFO.get();
        if(null!=map){
            log.error("CLASS_METHOD : " +map.get("method"));
            log.error("ARGS : " + map.get("args"));
            LogResult.INFO.remove();
        }
        
        log.error("CaseBy : " + ex.getCause());
        Result<Exception> res=     ResultUtil.outError(ex);
        log.error("返回結果:"+res.toString(),ex);
        return res;
    }
    
    /**
     * 攔截捕捉自定義異常 MyException.class
     * @param ex
     * @return
     */
    @ResponseBody
    @ExceptionHandler(value = CustomException.class)
    public Result<CustomException> myErrorHandler(CustomException ex) {
        HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
        log.error("URL:"+request.getRequestURI());
        log.error("HTTP_METHOD : " + request.getMethod());
        log.error("IP : " + request.getRemoteAddr());
        Map<String, String> map = LogResult.INFO.get();
        if(null!=map){
            log.error("CLASS_METHOD : " +map.get("method"));
            log.error("ARGS : " + map.get("args"));
            LogResult.INFO.remove();
        }
        log.error("CaseBy : " + ex.getCause());
        Result<CustomException> res=     ResultUtil.outError(ex);
        log.error("返回結果:"+res.toString());
        return res;
    }
 
}
 

 

package com.shuidi.common.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LoggerUtil {

    public static Logger getLogger(Class<?> clazz){
        return LoggerFactory.getLogger(clazz);
    }
    
}
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章