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(",");
}
}
}
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 {};
}



