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项目控制台中文乱码
