千家信息网

springboot启动项目打印接口列表的实现方法

发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,本篇内容介绍了"springboot启动项目打印接口列表的实现方法"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能
千家信息网最后更新 2025年02月01日springboot启动项目打印接口列表的实现方法

本篇内容介绍了"springboot启动项目打印接口列表的实现方法"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

目录
  • springboot 启动项目打印接口列表

    • 环境

    • 修改配置文件

  • Springboot项目添加接口入参统一打印

    • 新建注解,用于实现参数打印功能的增强

    • 自定义序列化规则

    • 写参数打印增强,这里选择环绕增强

springboot 启动项目打印接口列表

环境

  • springboot 2.3.2.RELEASE

修改配置文件

logging:  level:    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping: trace

结果:

Springboot项目添加接口入参统一打印

需求:要求接口被调用时要打印被调用方法名,以及入参情况,参数格式化时选择fastjson

注:使用fastjson序列化时脱敏,建议入参统一使用自定义的对象类型作为入参

如果不需要参数脱敏,直接使用增强中相关代码,并去除参数脱敏相关代码即可

新建注解,用于实现参数打印功能的增强

@Target({ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface ParamInfo {    /**     * 取消统一打印参数     * 默认为false统一打印     * 如需自定义参数打印 请赋值为true     */    boolean unPrint() default false;    /**     * 需要脱敏的字段,如密码等     */    String[] fields() default {};}

自定义序列化规则

/** * 序列化过滤器:值替换 * */public class ReplaceFieldFilter implements ValueFilter {    /**     * 需要进行替换的属性名和替换值     * key:属性名     * value:替换值     */    private Map fieldMap;    public ReplaceFieldFilter() {    }    public ReplaceFieldFilter(Map fieldMap) {        this.fieldMap = fieldMap;    }    @Override    public Object process(Object o, String name, Object value) {        if(!CollectionUtils.isEmpty(fieldMap)){            Iterator> iterator = fieldMap.entrySet().iterator();            while (iterator.hasNext()){                Map.Entry next = iterator.next();                if(next.getKey().equalsIgnoreCase(name)){                    return next.getValue();                }            }        }        return value;    }    public Map getFieldMap() {        return fieldMap;    }    public void setFieldMap(Map fieldMap) {        this.fieldMap = fieldMap;    }    /**     * 传入需要脱敏的字段名,序列化时格式化为 * 号     */    public ReplaceFieldFilter(String... fields) {        String str = "******";        fieldMap = new HashMap<>(4);        for (String field : fields) {            fieldMap.put(field, str);        }    }}

写参数打印增强,这里选择环绕增强

@Component@Aspect//表示增强的执行顺序,如果多个增强,数值小的先被执行@Order(0)public class ParamInfoAspect {    private static final Logger LOGGER = LoggerFactory.getLogger(ParamInfoAspect.class);    @Around("execution(* com.service.impl.*.*(..))")    public Object printParam(ProceedingJoinPoint joinPoint) throws Throwable {        long startTime = System.currentTimeMillis();        String requestId = RandomStringUtils.randomAlphanumeric(16);        Object returnValue = null;        try {            Object[] args = joinPoint.getArgs();            // 获取方法对象            MethodSignature signature = (MethodSignature) joinPoint.getSignature();            Method method = signature.getMethod();            //通过注解获取脱敏字段,之后初始化fieldMap,完成字段脱敏            ParamInfo annotation = method.getAnnotation(ParamInfo.class);            Map fieldMap = new HashMap<>(4);            fieldMap.put("password", "******");            if (annotation != null) {                //获取需要脱敏的字段名数组                String[] fields = annotation.fields();                for (String field : fields) {                    fieldMap.put(field, "******");                }            }            String param;            //参数整合,多字段入参整合为对象,单个对象入参格式不变            if (args.length > 1 || (args.length == 1 && args[0].getClass() == String.class)) {                Map paramMap = new LinkedHashMap<>();                String[] parameterNames = signature.getParameterNames();                for (int i = 0; i < parameterNames.length; i++) {                    paramMap.put(parameterNames[i], args[i]);                }                param = "[" + JSON.toJSONString(paramMap, new ReplaceFieldFilter(fieldMap)) + "]";            } else {                param = JSON.toJSONString(args, new ReplaceFieldFilter(fieldMap));            }            String methodName = method.getName();            LOGGER.info("method:[{}], parameter:{}, requestId:[{}]", methodName, param, requestId);            returnValue = joinPoint.proceed();            return returnValue;        } catch (Exception e) {            LOGGER.error("system is error:", e);   //可在这里定义程序异常时的错误返回值            returnValue = ErrorCode.SYSTEM_ERROR;            return returnValue;        } finally {            LOGGER.info("request cost:{}ms, requestId:[{}]", System.currentTimeMillis() - startTime, requestId);            LOGGER.info("returnValue:[{}], requestId:[{}]", returnValue, requestId);        }    }}

"springboot启动项目打印接口列表的实现方法"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

0