网站根域名是什么,网页托管平台排名,怎样建造网站,做网站的结论和心得注解AOP实现接口方法出入参打印 0、前言1、自定义注解2、定义AOP3、封装日志打印方法 0、前言
针对加入spring bean容器的实例方法#xff0c;通过注解aop实现打印方法调用的出入参#xff0c;通过注解可以配置是否打印出入参#xff0c;出入参中的单列集合或双列集合是否打… 注解AOP实现接口方法出入参打印 0、前言1、自定义注解2、定义AOP3、封装日志打印方法 0、前言
针对加入spring bean容器的实例方法通过注解aop实现打印方法调用的出入参通过注解可以配置是否打印出入参出入参中的单列集合或双列集合是否打印选择非全量打印只会打印集合的大小
1、自定义注解
import java.lang.annotation.*;Documented
Retention(RetentionPolicy.RUNTIME)
Target({ElementType.TYPE, ElementType.METHOD})
public interface LogFormatConsole {/*** 入参* 是否打印全量参数 true-集合类型全量打印 false-集合类型只打印数量*/boolean isFullPrintReq() default true;/*** 出参* 是否打印全量参数 true-集合类型全量打印 false-集合类型只打印数量*/boolean isFullPrintResp() default false;/*** 是否打印入参 默认打印*/boolean isPrintReqParam() default true;/*** 是否打印出参 默认打印*/boolean isPrintRespParam() default true;
}2、定义AOP
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.google.common.collect.Maps;
import com.lqt.hospital.platform.common.annotation.LogFormatConsole;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.Map;import static com.lqt.hospital.platform.common.utils.ToolsUtil.*;/*** DATE: 2023/12/28 18:45* Author: 小爽帅到拖网速*/
Aspect
Component
public class FormatConsoleAop {/*** 日志打印切入点*/Pointcut(within(com.lqt.hospital.platform.common.annotation.LogFormatConsole) || annotation(com.lqt.hospital.platform.common.annotation.LogFormatConsole))private void consolePointCut() {}Around(consolePointCut())public Object around(ProceedingJoinPoint point) throws Throwable {// 获取目标签名和方法MethodSignature signature (MethodSignature) point.getSignature();Method method signature.getMethod();// 目标方法名String methodName method.getName();// 获取目标方法注解LogFormatConsole anno method.getAnnotation(LogFormatConsole.class);// 是否全量打印集合参数-入参boolean fullPrintReq anno.isFullPrintReq();// 是否全量打印集合参数-出参boolean fullPrintResp anno.isFullPrintResp();// 是否打印入参boolean printReqParam anno.isPrintReqParam();// 是否打印出参boolean printRespParam anno.isPrintRespParam();if (printReqParam) {// 打印入参// 获取方法的参数列表String[] parameterNames signature.getParameterNames();// 获取参数值Object[] args point.getArgs();if (args.length 0) {// 构建请求入参集MapString, Object reqParamMap buildReqParamMap(fullPrintReq, parameterNames, args);// 打印请求入参formatConsoleInfoLogReq(methodName, reqParamMap, (boolean) reqParamMap.get(fullPrintReq));}}// 执行目标方法Object result point.proceed();if (printRespParam) {// 打印出参formatConsoleInfoLogResp(methodName, result, fullPrintResp);}return result;}/*** 构建请求入参集*/private MapString, Object buildReqParamMap(boolean fullPrintReq, String[] parameterNames, Object[] args) {String sizeStr;MapString, Object reqParamMap Maps.newHashMap();boolean nofullPrintFlag false;for (int i 0; i Math.min(parameterNames.length, args.length); i) {// 参数值final Object arg args[i];// 参数名final String parameterName parameterNames[i];if (ObjectUtil.hasEmpty(arg, parameterName)) {continue;}if (arg instanceof HttpServletRequest) {// 提取HttpServletRequest有效信息putReqHeaderIntoMap(reqParamMap, (HttpServletRequest) arg);} else if (!fullPrintReq) {// 标识部分不全量打印nofullPrintFlag true;// 针对集合参数打印集合大小if (arg instanceof Collection) {// 单列集合sizeStr size ((Collection?) arg).size();reqParamMap.put(parameterName, sizeStr);}// else if (args[i] instanceof Map) {// // 双列集合// sizeStr size ((Map?, ?) args[i]).size();// reqParamMap.put(parameterNames[i], sizeStr);// }else {// pojoreqParamMap.put(parameterName, arg);}} else {// pojoreqParamMap.put(parameterName, arg);}}if (!fullPrintReq) {// 标识部分不全量打印fullPrintReq nofullPrintFlag;}reqParamMap.put(fullPrintReq, fullPrintReq);return reqParamMap;}/*** 提取HttpServletRequest有效信息*/private void putReqHeaderIntoMap(MapString, Object map, HttpServletRequest request) {String unitId request.getHeader(UnitId);String userId request.getHeader(UserId);map.put(unitId, unitId);map.put(userId, userId);}}
3、封装日志打印方法
Log4j2
public class ToolsUtil { /*** 格式化打印info日志** param methodName 方法名* param mainMsg 主信息* param param 参数* param isFullPrint 是否不打印全量参数 true-集合类型只打印数量 false-集合类型全量打印*/public static void formatConsoleInfoLog(String methodName, String mainMsg, Object param, boolean isFullPrint) {if (ObjectUtil.hasEmpty(methodName, param)) {return;}String paramStr null;if (param instanceof Number) {// 数值类型paramStr param.toString();} else if (!isFullPrint) {// 不进行全量打印if (param instanceof Collection) {// 单列集合paramStr String.valueOf(((Collection?) param).size());mainMsg mainMsg size;}// else if (param instanceof Map) {// // 双列集合// paramStr String.valueOf(((Map?, ?) param).size());// mainMsg mainMsg size;// }else if (param instanceof Result) {// 针对Result data里边存在的单列或双列集合进行处理Object data ((Result?) param).getData();if (data instanceof Collection) {data size ((Collection?) data).size();}// else if (data instanceof Map) {// data size ((Map?, ?) data).size();// }((Result) param).setData(data);paramStr JSONUtil.toJsonStr(param);}} else {// pojoparamStr JSONUtil.toJsonStr(param);}log.info([{}] {}{}, methodName, mainMsg, paramStr);}/*** 格式化打印info日志-请求入参** param methodName 方法名* param param 参数* param isFullPring 是否不打印全量参数 true-集合类型只打印数量 false-集合类型全量打印*/public static void formatConsoleInfoLogReq(String methodName, Object param, boolean isFullPring) {formatConsoleInfoLog(methodName, 请求入参, param, isFullPring);}/*** 格式化打印info日志-请求出参** param methodName 方法名* param param 参数* param isFullPring 是否不打印全量参数 true-集合类型只打印数量 false-集合类型全量打印*/public static void formatConsoleInfoLogResp(String methodName, Object param, boolean isFullPring) {formatConsoleInfoLog(methodName, 接口出参, param, isFullPring);}
}