public static BaseResp validate(T obj) {
BaseResp baseVO;
try {
baseVO = new ValidationUtil<>(obj).validate();
} catch (IllegalAccessException ex) {
throw new InternalError("Unexpected IllegalAccessException: " + ex.getMessage());
}
return baseVO;
}
====== ServiceConfig ======
//环绕通知
@Around("executeService()")
public Object doAround(ProceedingJoinPoint joinPoint) {
Object result;
try {
StringBuilder sb = new StringBuilder();
Signature signature = joinPoint.getSignature();
if (signature != null) {
sb.append(signature.getDeclaringType() + " method=>" + signature.getName());
}
Object[] args = joinPoint.getArgs();
//自动参数验证
for (Object arg : args) {
BaseResp resp = BeanUtil.validate(arg);
if (resp != null) {
logger.info(LOG_SERVICE_RESP, resp);
return resp;
}
}
//有返回参数 则需返回值
result = joinPoint.proceed();
} catch (Throwable t) {
}
return result;
}
====== ValidationF ======
package com.xiaosq.common
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @author Morgan.L
* @version 1.0
* @date 4/9/2020 4:15 PM
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface ValidationF {
enum Type {PhoneNo, NotNull, BankCardNo, NotBlank, IdCardNo}
Type type();
String[] msgParam();
}
====== ValidationUtil ======
package com.xiaosq.common;
import com.xiaosq.common.BaseResp;
import com.xiaosq.common.CodeMsgEnum;
import org.apache.commons.lang3.StringUtils;
import java.lang.annotation.Annotation;
import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Field;
/**
* @author Morgan.L
* @version 1.0
* @date 4/9/2020 4:13 PM
*
* 对于前端web层验证:把所有参数验证完了,再返回验证信息。
* 对于Service层验证:发现一个错误立刻停止验证,并返回错误信息。
*/
public class ValidationUtil {
private final T object;
public ValidationUtil(T object) {
this.object = object;
}
public T getObject() {
return object;
}
public BaseResp validate() throws IllegalAccessException {
if (this.getObject() == null) {
return null;
}
Class> clazz = this.getObject().getClass();
// 获取实体类的所有属性,返回Field数组
Field[] fields = clazz.getDeclaredFields();
AccessibleObject.setAccessible(fields, true);
for (Field field : fields) {
for (Annotation annotation : field.getDeclaredAnnotations()) {
if (annotation instanceof ValidationF) {
ValidationF validation = (ValidationF) annotation;
if (ValidationF.Type.NotBlank.equals(validation.type())) {
if (field.get(object) == null || StringUtils.isBlank(field.get(object) + "")) {
return BeanUtil.createResp(CodeMsgEnum.PARAM_IS_BLANK, validation.msgParam());
}
} else if (ValidationF.Type.BankCardNo.equals(validation.type())) {
if (field.get(object) == null || StringUtils.isBlank((String) field.get(object))) {
return BeanUtil.createResp(CodeMsgEnum.PARAM_IS_BLANK, validation.msgParam());
} else {
String fieldValue = (String) field.get(object);
if (fieldValue.length() < 16 || fieldValue.length() > 19) {
return BeanUtil.createResp(CodeMsgEnum.INVALID_BANK_CARD_NO, validation.msgParam());
}
}
} else if (ValidationF.Type.PhoneNo.equals(validation.type())) {
if (field.get(object) == null || StringUtils.isBlank((String) field.get(object))) {
return BeanUtil.createResp(CodeMsgEnum.PARAM_IS_BLANK, validation.msgParam());
} else {
String fieldValue = ((String) field.get(object));
if (fieldValue.length() != 11 || !fieldValue.startsWith("1") || !fieldValue.matches("[0-9]+")) {
return BeanUtil.createResp(CodeMsgEnum.INVALID_PHONE_NO, validation.msgParam());
}
}
} else if (ValidationF.Type.IdCardNo.equals(validation.type())) {
if (field.get(object) == null || StringUtils.isBlank((String) field.get(object))) {
return BeanUtil.createResp(CodeMsgEnum.PARAM_IS_BLANK, validation.msgParam());
} else {
String fieldValue = (String) field.get(object);
if (fieldValue.length() > 18) {
return BeanUtil.createResp(CodeMsgEnum.INVALID_ID_CARD_NO, validation.msgParam());
}
}
} else if (ValidationF.Type.NotNull.equals(validation.type())) {
if (field.get(object) == null) {
return BeanUtil.createResp(CodeMsgEnum.PARAM_IS_NULL, validation.msgParam());
}
}
}
}
}
return null;
}
}