后台接口的那些坑:1.约定的字段没有

问题描述

如果接口文档约定了返回格式为:

{
    "name": "test", 
    "age": 24
}
复制代码

但实际返回的为:

{
    "age": 24
}
复制代码

也就是缺少字段时,如何防止bean.getName()的时候出现空指针呢?

解决方案

通过反射给实体类的null字段设置默认值。

public class ReflectUtil {

    /**
     * 通过反射,给null字段设置默认值
     *
     * @param obj
     */
    public static void setDefaultValueIfNull(Object obj) {
        try {
            Class<?> clazz = obj.getClass();
            Field[] declaredFields = clazz.getDeclaredFields();
            for (Field field : declaredFields) {
                field.setAccessible(true);
                Class<?> type = field.getType();
                Object value = field.get(obj);
                //基本类型为null
                if (value == null) {
                    if (type == String.class) {
                        field.set(obj, "");
                    } else if (type == Boolean.class) {
                        field.set(obj, false);
                    } else if (type == Integer.class) {
                        field.set(obj, 0);
                    } else if (type == Float.class) {
                        field.set(obj, 0F);
                    } else if (type == Long.class) {
                        field.set(obj, 0L);
                    } else if (type == Double.class) {
                        field.set(obj, 0D);
                    } else if (type == List.class) {
                        field.set(obj, new ArrayList<>());
                    }
                } else {
                    //设置List的子项
                    if (type == List.class) {
                        List list = (List) value;
                        for (Object o : list) {
                            setDefaultValueIfNull(o);
                        }
                    }
                    //设置依赖的bean
                    else {
                        setDefaultValueIfNull(value);
                    }
                }
            }
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}
复制代码

测试结果

public class ReflectUtilTest {
    @Test
    public void setDefaultValueIfNull() throws Exception {
        TestBean bean = new TestBean();
        ReflectUtil.setDefaultValueIfNull(bean);
        System.out.println(bean.toString());
    }

    @Test
    public void reference() throws Exception {
        TestBean bean = new TestBean();
        //设置bean
        TestBean ref = new TestBean();
        bean.setaBean(ref);
        //设置list
        TestBean listItem = new TestBean();
        ArrayList<TestBean> aList = new ArrayList<>();
        aList.add(listItem);
        bean.setaList(aList);
        ReflectUtil.setDefaultValueIfNull(bean);
        System.out.println(bean.toString());
    }

}
复制代码

输出为:

setDefaultValueIfNull

TestBean{aString='', aInteger=0, aFloat=0.0, aLong=0, aList=[], aBean=null}
复制代码

reference

TestBean{aString='', aInteger=0, aFloat=0.0, aLong=0, aList=[TestBean{aString='', aInteger=0, aFloat=0.0, aLong=0, aList=[], aBean=null}], aBean=TestBean{aString='', aInteger=0, aFloat=0.0, aLong=0, aList=[], aBean=null}}
复制代码

测试的Bean为:

public class TestBean {
    private String aString;
    private Integer aInteger;
    private Float aFloat;
    private Long aLong;
    private List<TestBean> aList;
    private TestBean aBean;

    public TestBean getaBean() {
        return aBean;
    }

    public void setaBean(TestBean aBean) {
        this.aBean = aBean;
    }

    public String getaString() {
        return aString;
    }

    public void setaString(String aString) {
        this.aString = aString;
    }

    public Integer getaInteger() {
        return aInteger;
    }

    public void setaInteger(Integer aInteger) {
        this.aInteger = aInteger;
    }

    public Float getaFloat() {
        return aFloat;
    }

    public void setaFloat(Float aFloat) {
        this.aFloat = aFloat;
    }

    public Long getaLong() {
        return aLong;
    }

    public void setaLong(Long aLong) {
        this.aLong = aLong;
    }

    public List<TestBean> getaList() {
        return aList;
    }

    public void setaList(List<TestBean> aList) {
        this.aList = aList;
    }

    @Override
    public String toString() {
        return "TestBean{" +
                "aString='" + aString + '\'' +
                ", aInteger=" + aInteger +
                ", aFloat=" + aFloat +
                ", aLong=" + aLong +
                ", aList=" + aList +
                ", aBean=" + aBean +
                '}';
    }
}

复制代码
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值