快捷搜索: 王者荣耀 脱发

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;
经验分享 程序员 微信小程序 职场和发展