实现以下目的
代码
package com.nutzfw.modules.api.gecorder.change.connective.action;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.nutz.ioc.loader.annotation.IocBean;
import java.lang.reflect.Field;
import java.util.*;
import java.util.stream.Collectors;
@IocBean(name = "chgConOrdActionTmp")
@Data
public class ChgConOrdAction {
@Group(group = 1, isNeed = true)
private String name;
@Group(group = 2, isNeed = true)
private String age;
@Group(group = 3, isNeed = true)
private String sex;
public static void main(String[] args) {
ChgConOrdAction chgConOrdAction = new ChgConOrdAction();
List<String> errorMessage = validateObjectFields(chgConOrdAction, 1);
System.out.println(errorMessage);
}
// 对单数组进行校验,返回错误信息的数组
private static List<String> validateObjectFields(Object unCheckObject, int ignoreGroupId) {
List<String> errorMessage = new ArrayList<>();
Field[] declaredFields = unCheckObject.getClass().getDeclaredFields();
Arrays.stream(declaredFields).map(x -> {
Group group = x.getDeclaredAnnotation(Group.class);
if (group != null) return GroupAndFiled.builder().field(x).group(group).build();
return null;
}).filter(Objects::nonNull).filter(x -> x.getGroup().group() != ignoreGroupId).collect(Collectors.groupingBy(x -> x.getGroup().group()))
.forEach(((group, groupAndFields) -> {
StringBuilder messageBuilder = new StringBuilder();
groupAndFields.stream()
.filter(g -> !checkFiledNotNull(g.getField(), unCheckObject))
.forEach(x -> messageBuilder.append(x.getField().getName()).append("-> not null"));
errorMessage.add(messageBuilder.toString());
}));
return errorMessage;
}
private static boolean checkFiledNotNull(Field field, Object o) {
Group group = field.getAnnotation(Group.class);
if (group == null) return true;
try {
if (group.isNeed() && field.get(o) == null) return false;
} catch (IllegalAccessException e) {
return true;
}
return true;
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
private static class GroupAndFiled {
Group group;
Field field;
}
}
package com.nutzfw.modules.api.gecorder.change.connective.action;
import java.lang.annotation.*;
// 自定义注解,实现分组的功能,每一个字段是否需要
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Documented
public @interface Group {
//组别
int group() default 0;
boolean isNeed() default false;
}
运行结果
// 忽略节点1,对2,3节点进行校验,并且分组,输出notnull的值
[age-> not null, sex-> not null]