自定义注解实现接口操作日志收集

主要依赖:implementation 'org.springframework.boot:spring-boot-starter-aop'

创建自定义日志注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CustomLog {
    /**
     * 操作接口说明
     */
    String state() default "";

    /**
     * 是否保存请求的参数
     */
    boolean isSaveRequestData() default true;

    /**
     * 是否保存响应的参数
     */
    boolean isSaveResponseData() default true;
}

创建切面

@Aspect
@Component
@Slf4j
public class LogAspect {

    @Autowired
    private IOperationsService operationsService;

    @Pointcut("@annotation(tech.test.annotation.CustomLog)")
    public void logPointCut() {}

    /**
     * 处理完请求后执行
     */
    @AfterReturning(pointcut = "logPointCut()", returning = "jsonResult")
    public void doAfterReturning(JoinPoint joinPoint, Object jsonResult) {
        handleLog(joinPoint, jsonResult);
    }

    /**
     * 处理日志
     */
    protected void handleLog(final JoinPoint joinPoint, Object jsonResult) {
        // 处理入参
        String args = argsArrayToString(joinPoint.getArgs());
        JSONObject jsonObject = JSONObject.parseObject(args);
        String serialNumber = JSON.toJSONString(jsonObject.get("serialNumber"));
        // 获取自定义注解上的参数
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();
        CustomLog customLog = method.getAnnotation(CustomLog.class);
        // 所需日志信息保存到数据库
        Operations operations = new Operations();
        operations.setOperatorId(SecurityContextHolderUtil.userId());
        operations.setOperatorName(SecurityContextHolderUtil.userName());
        operations.setMethod(method.getName());
        operations.setOperation(customLog.state());
        if (customLog.isSaveRequestData()) {
            operations.setRequestData(args);
        }
        if (customLog.isSaveResponseData()) {
            operations.setResponseData(JSON.toJSONString(jsonResult));
        }
        operationsService.insertOperations(operations);
    }

    /**
     * 组装入参
     */
    private String argsArrayToString(Object[] paramsArray) {
        String params = "";
        if (paramsArray != null && paramsArray.length > 0) {
            for (int i = 0; i < paramsArray.length; i++) {
                if (!isFilterObject(paramsArray[i])) {
                    Object jsonObj = JSON.toJSON(paramsArray[i]);
                    params += jsonObj.toString() + " ";
                }
            }
        }
        if (("").equals(params.trim())) {
            params = "无入参";
        }
        return params.trim();
    }

    /**
     * 判断是否需要过滤的对象。
     */
    public boolean isFilterObject(final Object o) {
        return o instanceof MultipartFile || o instanceof HttpServletRequest || o instanceof HttpServletResponse;
    }
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自定义注解可以用于实现接口管理。在开发步骤中,我们可以使用自定义的注解类来标记接口,然后通过相应的处理器来处理这些标记的接口。 首先,我们需要定义一个自定义注解类,比如`@CustomEndpoint`。这个注解可以使用`@Retention`注解来指定其保留策略为`RUNTIME`,表示在运行时仍然可用。同时,可以使用`@Target`注解来指定注解的作用目标为类。这样,我们就可以在接口上使用`@CustomEndpoint`注解来标记该接口需要进行管理。 接着,在接口管理的处理器中,我们可以使用反射来扫描并处理所有标记了`@CustomEndpoint`注解的接口。我们可以通过获取所有带有该注解的类,然后对这些类进行相应的操作,比如注册、调用等。 在这个处理器中,我们可以使用类似于`@Component`注解的机制来扫描和管理这些接口。我们可以定义一个`HandlerMapping`类,该类负责维护一个接口与处理器的映射关系。当扫描到一个标记了`@CustomEndpoint`注解的接口时,我们可以将其实例化,并将其加入到`HandlerMapping`中进行管理。 通过这种方式,我们就可以实现自定义注解来进行接口管理。每当有新的接口需要加入管理时,我们只需要在接口上添加`@CustomEndpoint`注解即可。而处理器会自动将其加入到管理中,方便后续的操作和调用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [SpringMVC自定义注解实现接口调用](https://blog.csdn.net/asoklove/article/details/114986898)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [基于SpringBoot 的图书管理系统](https://download.csdn.net/download/weixin_52395743/85850783)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值