aop注解作用在filed上无效问题
注:@annotation只能用于拦截在方法上定义了对应注解的方法,在类上的注解@annotation是不起作用的,因为spring aop本身就是基于方法拦截的。
如果先在字段上实现代理,需要在外面进行方法包装,以字段脱敏为例
Sm4EncodeData:
package com.zy.platform.common.core.annotation; import java.lang.annotation.*; @Documented @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface Sm4EncodeData { }
Sm4EncodeMethod:
package com.zy.platform.common.core.annotation; import java.lang.annotation.*; @Documented @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Sm4EncodeMethod { }
Sm4EnDeCodeAspect:
package com.zy.platform.common.core.aspect; import com.zy.platform.common.core.annotation.Sm4DecodeData; import com.zy.platform.common.core.annotation.Sm4EncodeData; import com.zy.platform.common.core.utils.Sm4Utils; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.springframework.stereotype.Component; import java.lang.reflect.Field; @Aspect @Component public class Sm4EnDeCodeAspect { @Pointcut("@annotation(com.zy.platform.common.core.annotation.Sm4EncodeMethod)") public void sm4EncodeDataPointCut(){ } @Around("sm4EncodeDataPointCut()") public Object encodeAround(ProceedingJoinPoint joinPoint){ Object responseObj = null; try { responseObj = joinPoint.proceed(); Field[] fields = responseObj.getClass().getDeclaredFields(); for (Field field : fields) { if (field.isAnnotationPresent(Sm4EncodeData.class)){ if (!field.isAccessible()){ field.setAccessible(true); } Object o = field.get(responseObj); field.set(responseObj, Sm4Utils.encode(o+"")); } } } catch (Throwable e) { e.printStackTrace(); } return responseObj; } }
test:
/** * encTest * @return */ @Sm4EncodeMethod @AuthIgnore @GetMapping("/encTest") public ServerResponse encTest(@RequestBody(required=false) SysUser sysUser) { return ServerResponse.createBySuccess(sysUser); }
/** * 真实姓名 */ @Sm4EncodeData @TableField(value = "real_name") private String realName;
上一篇:
IDEA上Java项目控制台中文乱码