自定义注解处理导入的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);
}
}