一、背景

最近在写代码判断实体类是否为空时,发现没有一个公用的方法去调用。只能使用判断某个字段是否为空,不能判断实体类所有的字段,因此想到了去写一个方法去判断实体类中是否有任一个字段为空。


二、问题与构思

首先想到的是使用Java反射去遍历所有的字段值,但是后来加入了嵌套字段就必须进行递归。为了省去不必要的麻烦,去问了一下小助手,使用了fasterxml.jackson的包,使用JsonNode去构建实体类的参数树。


三、相关代码

import cn.hutool.json.JSONConfig;
import cn.hutool.json.JSONUtil;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

......

    /**
     *
     * 判断实体类是否所有字段值为空
     *
     *
     * @param entity       实体类
     * @return true/false
     */
    public static <T> boolean isAllFieldsValueNotNull(T entity) {
        try {
            String s = JSONUtil.toJsonStr(entity, JSONConfig.create().setIgnoreNullValue(false));
            ObjectMapper objectMapper = new ObjectMapper();
            JsonNode jsonNode = objectMapper.readTree(s);
            if (jsonNode.isObject() && !isNestedJsonObjectNotNull(jsonNode)) {
                return false;
            }
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    
    
	private static boolean isNestedJsonObjectNotNull(JsonNode jsonNode) {
        if (jsonNode.isNull()) {
            return false;
        }
        else if (jsonNode.isObject()) {
            for (JsonNode childNode : jsonNode) {
                if (!isNestedJsonObjectNotNull(childNode)) {
                    return false;
                }
            }
        }
        return true;
    }


四、总结

写代码时要简化递归语句、简化时间复杂度、方法注释简洁易懂。