如何实现自定义注解

41 阅读1分钟
package com.hmy.ccp.common.annotation;

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 org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import java.lang.reflect.Field;
import java.util.Collection;

@Component
@Aspect
public class HmyCheckAspect {

    @Pointcut(value = "@annotation(com.hmy.ccp.common.annotation.HmyValidator)")
    public void checkParameter() {
    }

    @Around("checkParameter()")
    public Object handle(ProceedingJoinPoint joinPoint) throws Throwable {
        if (joinPoint.getArgs()[0] == null) {
            return joinPoint.proceed();
        }
        StringBuilder message = new StringBuilder();
        Field[] fields = joinPoint.getArgs()[0].getClass().getDeclaredFields();
        Object object = joinPoint.getArgs()[0];
        for (Field field : fields) {
            HmyNotEmpty hmyNotEmpty = field.getAnnotation(HmyNotEmpty.class);
            HmyLength hmyLength = field.getAnnotation(HmyLength.class);
            HmySize hmySize = field.getAnnotation(HmySize.class);
            HmyNotNull hmyNotNull = field.getAnnotation(HmyNotNull.class);
            field.setAccessible(true);
            // 字符串、集合
            if (hmyNotEmpty != null) {
                if (field.get(object) == null) {
                    message.append(hmyNotEmpty.message()).append(",");
                }
            }
            if (hmyLength != null) {
                // 字符串
                if (field.get(object) instanceof String) {
                    String s = (String) field.get(object);
                    if (s.length() > hmyLength.length()) {
                        message.append(hmyLength.message()).append(",");
                    }
                }
            }
            if (hmySize != null) {
                // 集合
                if (field.get(object) instanceof Collection<?>) {
                    Collection<?> c = (Collection<?>) field.get(object);
                    if (CollectionUtils.isEmpty(c)) {
                        message.append(hmyNotEmpty.message()).append(",");
                    }

                    if (c.size() > hmySize.max() && hmySize.max() != 0) {
                        message.append(hmySize.message()).append(",");
                    }
                    if (c.size() < hmySize.min()) {
                        message.append(hmySize.message()).append(",");
                    }
                }

                // 整形包装类
                if (field.get(object) instanceof Integer) {
                    Integer integer = (Integer) field.get(object);
                    if (integer > hmySize.max() && hmySize.max() != 0) {
                        message.append(hmySize.message()).append(",");
                    }
                    if (integer < hmySize.min() && hmySize.min() != 0) {
                        message.append(hmySize.message()).append(",");
                    }
                }
                if (field.get(object) instanceof Long) {
                    Long aLong = (Long) field.get(object);
                    if (aLong > hmySize.max() && hmySize.max() != 0) {
                        message.append(hmySize.message()).append(",");
                    }
                    if (aLong < hmySize.min() && hmySize.min() != 0) {
                        message.append(hmySize.message()).append(",");
                    }
                }
            }

            // Integer/Long
            if (hmyNotNull != null) {
                if (field.get(object) == null) {
                    message.append(hmyNotNull.message()).append(",");
                }
            }
        }
        if (!StringUtils.isEmpty(message.toString())) {
            throw new RuntimeException(message.substring(0, message.toString().length() - 1));
        }
        return joinPoint.proceed();
    }
}


package com.hmy.ccp.common.annotation;

import java.lang.annotation.*;

@Target({ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER})
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface HmyValidator {
    Class<?>[] value() default {};
}


package com.hmy.ccp.common.annotation;

import java.lang.annotation.*;

@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR,
        ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface HmyLength {

    String message() default "{javax.validation.constraints.Size.message}";

    int length() default 0;

    Class<?>[] groups() default {};
}

package com.hmy.ccp.common.annotation;


import java.lang.annotation.*;


@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR,
        ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface HmyNotEmpty {

    String message() default "{javax.validation.constraints.Size.message}";

    Class<?>[] groups() default {};

}


package com.hmy.ccp.common.annotation;


import java.lang.annotation.*;


@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR,
        ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface HmyNotNull {

    String message() default "{javax.validation.constraints.Size.message}";

    Class<?>[] groups() default {};

}


package com.hmy.ccp.common.annotation;

import java.lang.annotation.*;

@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR,
        ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface HmySize {

    String message() default "{javax.validation.constraints.Size.message}";

    int max() default 0;
    int min() default 0;

    Class<?>[] groups() default {};
}