自定义注解

1、类注解

/**
 * 需要动态查询CodeTable数据字典时,在类上配置该注解
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CodeAnnotation {

}

2、字段注解

/**
 * 需要动态查询CodeTable数据字典时,在对应str属性上配置该注解
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CodeAnnotationProperties {

    String codeKeyProperties();

    String codeType();
}

3、Aspectj

@Aspect
@Component
public class CodeAspect {
    @Autowired
    private CodeTableService codeTableService;

    /**
     * 自动属性值注入(针对Mapper进行拦截)
     */
    @AfterReturning(value = "execution(* com.lujie.source.mode..mapper.*.*(..)) || execution(* com.lujie.common.dao.BaseMapper.*(..))", returning = "res")
    public void serviceReturn(JoinPoint joinPoint, Object res) throws Exception {
        if (ObjectUtil.isEmpty(res)) {
            return;
        }
        //是否为集合
        Boolean isList = res instanceof List ? true : false;
        Object obj = isList ? ((List<?>) res).get(0) : res;
        Class objClass = obj.getClass();
        Annotation[] allAnnos = objClass.getAnnotations();
        //若类标注了 @CodeAnnotation
        if (Arrays.stream(allAnnos).anyMatch(i -> i.annotationType() == CodeAnnotation.class)) {
            Field[] fields = objClass.getDeclaredFields();
            //遍历所有字段
            for (Field field : fields) {
                //若字段标注了 @CodeAnnotationProperties
                if (Arrays.stream(field.getAnnotations()).anyMatch(i -> i.annotationType() == CodeAnnotationProperties.class)) {
                    //获取标注类型
                    CodeAnnotationProperties codeAnnotationProperties = field.getAnnotation(CodeAnnotationProperties.class);
                    String codeType = codeAnnotationProperties.codeType();
                    List<CodeTable> codeTableList = codeTableService.findByType(codeType);
                    if (isList) {
                        for (Object sub : (List) res) {
                            setValue(fields, field, sub, codeTableList);
                        }
                    } else {
                        setValue(fields, field, res, codeTableList);
                    }
                }
            }
        }
    }

    /**
     * @param fields 字段集合
     * @param field  字段str
     * @param sub    对象
     * @throws Exception
     */
    public void setValue(Field[] fields, Field field, Object sub, List<CodeTable> codeTableList) throws Exception {
        CodeAnnotationProperties codeAnnotationProperties = field.getAnnotation(CodeAnnotationProperties.class);
        String codeKeyProperties = codeAnnotationProperties.codeKeyProperties();
        //寻找key
        for (Field field2 : fields) {
            if (field2.getName().equals(codeKeyProperties)) {
                field2.setAccessible(true);
                Object obj2 = field2.get(sub);
                CodeTable codeTable = codeTableList.stream().filter(i -> i.getCodeKey().equals(String.valueOf(obj2))).findFirst().orElse(null);

                //将值设置到str字段中
                field.setAccessible(true);
                field.set(sub, (ObjectUtil.isNotEmpty(codeTable) ? codeTable.getCodeName() : null));
            }
        }
    }
}
posted @ 2023-11-10 16:48  yifanSJ  阅读(34)  评论(0编辑  收藏  举报