nutz实现jsr303的补充

实现以下目的

  • 分组校验

代码

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]
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容