自定义注解处理导入的Excel字段值中的空格

1、创建注解

/**
 * @author Tang
 * @date 2024/6/19 13:58
 */
 
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface TrimmedStrings {
}

@Target 讲解

----TYPE:类、接口、枚举;
----FIELD:属性字段;
----METHOd:方法;
----PARAMETER:参数;
----CONSTRUCTOR:构造方法

@Retention 讲解

----RetentionPolicy.SOURCE:
注解只保留在源代码中,编译器在编译时会丢弃这种注解。
这种注解不会存在于编译后的 .class 文件中,也无法通过反射获取。

----RetentionPolicy.CLASS:
注解保留在 .class 文件中,但 JVM 在运行时不会加载这种注解。
这种注解不会在运行时通过反射获取。
这是默认的保留策略。

----RetentionPolicy.RUNTIME:
注解保留在 .class 文件中,并且在 JVM 运行时也会加载这种注解。
这种注解可以在运行时通过反射机制获取。

需要处理的VO类添加注解

@TrimmedStrings
@Data
@AllArgsConstructor
@NoArgsConstructor
public class RuleImportVo {
	@Excel(name = "规则代码")
	private String code;
	//...
}

2、创建切面

/**
 * @author Tang
 * @date 2024/6/19 13:55
 */
@Aspect
@Component
public class TrimmedStringAspect {

    @AfterReturning("execution(* org.jeecg.cims.service.impl.MyPointCutService.listPointCutHandling(..)) && args(list)")
    public List<?> listPointCutHandlingPointcut(List<?> list) throws Exception {
        for (Object obj : list) {
            trimStringFields(obj);
        }
        return  list;
    }


    private void trimStringFields(Object obj) throws IllegalAccessException {
        Class<?> clazz = obj.getClass();
        if(clazz.isAnnotationPresent(TrimmedStrings.class)){
            Field[] fields = clazz.getDeclaredFields();
            for (Field field : fields) {
                if (field.getType().equals(String.class)) {
                    field.setAccessible(true);
                    String value = (String) field.get(obj);
                    if (value != null) {
                        field.set(obj, value.trim());
                    }
                }
            }
        }
    }
}

切面创建的限制

1、切面通常可以拦截 Spring 管理的 Bean 中标注了 @Aspect 的切面,以及被 @Controller、@RestController、@Service 等注解标注的类中的方法
2、Spring AOP 有一些限制,例如它默认不会拦截同一个类内部的方法调用(不涉及代理的情况)。这意味着,如果在同一个类中,一个方法直接调用另一个方法(而不是通过代理调用),切面可能无法生效。
3、非 public 方法、static 方法、final 方法以及 private 方法也不能被 Spring AOP 拦截。
4、静态方法和切面:静态方法由于不属于对象的方法,而是类的方法,Spring AOP 默认无法拦截静态方法

例如指定切面的方法就是在@Service中才能成功被拦截,去除@Service注解则无法拦截

@Service
public class MyPointCutService {

    public void doSomething() {
        System.out.println("Doing something...");
    }

    public List<?> listPointCutHandling(List<?> list){
    	//处理
        return list;
    }
}

3、启动类中添加@EnableAspectJAutoProxy注解

@EnableAspectJAutoProxy
@SpringBootApplication
public class JeecgSystemApplication {
    public static void main(String[] args) {
        SpringApplication.run(JeecgSystemApplication.class, args);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值