首页 > 其他分享 >使用AOP和注解对DTO中的字段进行截断——第一次使用AOP和自定义注解的心得

使用AOP和注解对DTO中的字段进行截断——第一次使用AOP和自定义注解的心得

时间:2024-07-05 18:10:42浏览次数:16  
标签:log 自定义 joinPoint value field AOP 注解

是骚操作,但是为了应对特殊的需求,实现了通过在方法上应用@TruncateString注解,进入AOP,获得第一个参数中的DTO,然后获取DTO中加了@LimitStringLength注解,将字段修改之后返回。

#AOP中要注意的点:

  1. AOP由Spring管理,所以要生效的话需要加上@Component注解
  2. 可以把注解绑定到一个方法上,然后用这个注解的时候就会调用相应的@Around("truncateString()")标注的方法
@Pointcut("@annotation(com.kingstar.ficc.gtms.common.core.annotation.TruncateString)")
    void truncateString() {}
  1. 对于有返回的方法,AOP中的方法需要返回return joinPoint.proceed();不然被AOP拦截的方法返回会为空

自定义注解中要注意的点

  1. public @interface定义了一个注解
  2. 注解中参数用长得像方法一样的接口定义来接收
    int max(),然后如果没有default值,会报错
  3. @Retention
    -RetentionPolicy.SOURCE仅保留在源文件中
    -RetentionPolicy.CLASS保留至Class中,但运行时被丢弃
    -RetentionPolicy.RUNTIME jvm运行时也会使用该注解
  4. @target:注解可以应用的对象,注解不可以用在入参之中,如果要用在入参之中,需要应用在方法上
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LimitStringLength {

    int max() default Integer.MAX_VALUE; // 默认截取长度为最大值

}
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface TruncateString {

}
@Aspect
@Component
@Slf4j
public class TruncateStringAOP {


    @Pointcut("@annotation(com.kingstar.ficc.gtms.common.core.annotation.TruncateString)")
    void truncateString() {}


    @Around("truncateString()")
    public static Object getSubString(ProceedingJoinPoint joinPoint) throws Throwable {
        Object arg;
        try {
            arg = joinPoint.getArgs()[0];
        } catch (Exception e) {
            log.error("Failed to get argument from joinPoint", e);
            return joinPoint.proceed();
        }

        Field[] fields;
        try {
        fields = arg.getClass().getDeclaredFields();
        log.info("Truncating strings in object of class {}", arg.getClass().getName());
    } catch (Exception e) {
        log.error("Failed to get fields from object", e);
        return joinPoint.proceed();
        }
        try {
            for (Field field : fields) {
                if (field.isAnnotationPresent(LimitStringLength.class)) {
                    field.setAccessible(true); // 允许访问私有字段
                    String value = (String) field.get(arg);
                    log.info("Truncating field {} with value {}", field.getName(), value);
                    if (value != null && value.length() > field.getAnnotation(LimitStringLength.class).max()) {
                        String truncatedValue = value.substring(0, field.getAnnotation(LimitStringLength.class).max());
                        field.set(arg, truncatedValue);
                        log.info("Truncated value of field {} to {}", field.getName(), truncatedValue);
                    }
                }
            }
        } catch (Exception e) {
            log.error("Failed to truncate string", e);
            return joinPoint.proceed();
        }
        return joinPoint.proceed();
    }
}

标签:log,自定义,joinPoint,value,field,AOP,注解
From: https://www.cnblogs.com/peterzh/p/18286370

相关文章

  • 自定义流程表单开发优势体现在什么地方?
    提质、增效、降本,应该是很多职场办公需要实现的发展目标。那么,应用什么样的软件平台可以实现?低代码技术平台、自定义流程表单开发是目前流行于职场行业中的软件产品,可视化操作界面、够灵活、易维护等优势特点明显,在推进企业实现流程化办公的过程中深受欢迎。一起来了解自自定义流......
  • Springboot自定义数据源DruidDataSource
    1、Druid简介Java程序很大一部分要操作数据库,为了提高性能操作数据库的时候,又不得不使用数据库连接池。Druid是阿里巴巴开源平台上一个数据库连接池实现,结合了C3P0、DBCP等DB池的优点,同时加入了日志监控。Druid可以很好的监控DB池连接和SQL的执行情况,天生就是针对监控而......
  • 注解Annotation
    基本概念注解(Annotation)也叫做元数据,用于修饰包、类、方法、属性、构造器、局部变量等数据信息。和注释一样,注解不影响程序逻辑,但是注解可以被编译或运行,等同于嵌套在代码中的补充信息。在javaSE中,注解用于标记过时的功能,忽略警告等,在JavaEE中注解用于配置应用程序的任何切面,......
  • WPF自定义控件与样式-自定义按钮(Button)
    一、前言程序界面上的按钮多种多样,常用的就这几种:普通按钮、图标按钮、文字按钮、图片文字混合按钮。本文章记录了不同样式类型的按钮实现方法。二、固定样式的按钮固定样式的按钮一般在临时使用时或程序的样式比较固定时才会使用,按钮整体样式不需要做大的改动。2.1普通按钮-......
  • Laravel 宏指令(Macro)动态添加自定义方法到Laravel的核心组件中
    Laravel宏指令(Macro)在Laravel中,宏指令(Macro)是一种灵活的方式,允许您动态添加自定义方法到Laravel的核心组件中,如模型、查询构建器、集合等,以便在不改变核心代码的情况下扩展框架的功能。通过宏指令,您可以向Laravel内置的类添加自定义方法,实现更高级的功能和逻辑。福利彩......
  • ubuntu 自定义开机画面
    1. 修改UEFI固件图片2. 修改GRUB背景图片3. 修改Plymouth启动画面 1. 固件和启动过程UEFI固件加载图片:在系统启动时,UEFI固件首先加载,并显示制造商的Logo(如“LEGION”),这在启动过程中称为“splashscreen”。这张图片是嵌入在UEFI固件中的,用户通常无法直接修改或访问......
  • vue2和vue3自定义指令实现只读模式,禁止用户编辑
    解决代码表单组件大量disable的麻烦,实现只读。只需要在需要的地方加上v-read-only即可达到只读效果,快捷方便。实现思路父元素下添加一个遮罩层元素遮罩层元素的显示隐藏由参数决定要想简单快捷的实现,最好用的就是写一个遮罩层,通过遮罩来隔绝用户的操作。原始代码如下:<temp......
  • 微信小程序-自定义组件数据监听器observers
    一.监测自定义组件data值定义data值,在.js文件里面定义data值data:{num:10,count:100,obj:{name:'tom',age:10},arr:[1,2,3]}只有在data值进行改变后才会触发到数据监听的回调函数,如果数据没有改变回调函数不会被触发ob......
  • python logging 自定义备份的日志文件命名
    importtimeimportloggingfromlogging.handlersimportTimedRotatingFileHandlerdeflog_file_namer(log_file_name):log_file_name_split=log_file_name.split('.')log_suffix=log_file_name_split.pop(1)log_file_name_split.append(l......
  • Asp .Net Core 系列:基于 Castle DynamicProxy + Autofac 实践 AOP 以及实现事务、用户
    目录什么是AOP?.NetCore中有哪些AOP框架?基于CastleDynamicProxy实现AOPIOC中使用CastleDynamicProxy实现事务管理实现用户自动填充什么是AOP?AOP(Aspect-OrientedProgramming,面向切面编程)是一种编程范式,旨在通过将横切关注点(cross-cuttingconcerns)从主要业务逻辑......