@Slf4j
@Aspect
@Component
public class SensitiveAspect {
@Around("@annotation(com.caroLe.manager.common.annotation.Sensitive)")
public Object invoke(ProceedingJoinPoint point) throws Throwable {
log.info("执行SensitiveAspect");
Object target = point.getTarget();
Field[] fields = target.getClass().getDeclaredFields();
for (Field field : fields) {
Sensitive annotation = field.getAnnotation(Sensitive.class);
if (annotation != null) {
Object value = field.get(target);
DesensitizedUtil.DesensitizedType desensitizedType = annotation.type();
String desensitized = DesensitizedUtil.desensitized(value.toString(), desensitizedType);
field.set(target, desensitized);
}
}
return target;
}
}
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface Sensitive {
/**
* 脱敏数据类型
*/
DesensitizedUtil.DesensitizedType type() default DesensitizedUtil.DesensitizedType.CHINESE_NAME;
}
TbDriver tbDriver = new TbDriver();
BeanUtils.copyProperties(updateDriverAuthFormVO, tbDriver);
tbDriver.setId(updateDriverAuthFormVO.getDriverId());
tbDriver.setRealAuth(DriverStatusEnum.REDUCE_ORDER_VOLUME.getCode());
@Sensitive(type = DesensitizedUtil.DesensitizedType.CHINESE_NAME)
@ApiModelProperty("姓名")
private String name;
@Around的目标切点应该是一个方法,但这里是一个属性。
目标方法被调用时会自动执行@Around标记的这个方法(即现有代码的invoke方法),@Around标记的方法处理有@Sensitive注解的属性后,需要调用目标切点的方法,并返回该目标方法的结果
【以下回答由 GPT 生成】
问题分析: 根据提供的代码,可以看出SensitiveAspect类是一个切面类,使用@Aspect注解进行标识,用于处理带有@Sensitive注解的字段的脱敏操作。在invoke方法中,使用了Spring AOP的@Around注解来拦截目标方法,并执行脱敏操作。然后在代码中的TbDriver类中的属性上使用了@Sensitive注解。
解决方案: 1. 确保Spring容器中已经扫描到了SensitiveAspect类,并且在Spring配置中启用了@EnableAspectJAutoProxy注解来开启AOP功能。 2. 检查TbDriver类是否被Spring容器进行管理,可以通过@Component或@Bean注解来标识该类。 3. 检查TbDriver类中的属性是否被正确地标注了@Sensitive注解。
以上是我的解决方案,由于我无法获得完整的代码和环境配置,无法保证这些步骤可以解决问题。如果问题仍然存在,请提供更详细的信息以便我能够更好地帮助您解决问题。
【相关推荐】