问题描述
如果接口文档约定了返回格式为:
{
"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 +
'}';
}
}
复制代码