Bean抽值工具

        在做前后端分离的项目时,数据都是通过ajax方式返回给前端的,这个时候如果程序没有做好敏感数据剔除,那么很多数据都会返回给前端。

       但是如果每次都返回数据前都写一大串代码去指定返回那些数据,不免显得很麻烦,特别的类中有类的时候。

     因此自己实现了一个类抽值工具,可以级联获取值,直接一行代码搞定,反馈给前端。

      功能可能还不是很完善,只是实现了基础功能,后续还需要使用慢慢扩展吧,一下是代码,抛砖引玉,各位有好的意见,请指导。

public class BeanCutUtil {

	private BeanCutUtil() {
		throw new IllegalStateException("Utility class");
	}

	public static <T> Kv bean(T bean, String... fieldNames) {
		Kv kv = Kv.create();
		for (String fieldName : fieldNames) {
			setValue(bean, kv, fieldName);
		}
		return kv;
	}

	public static <T> List<Kv> list(List<T> list, String... fieldNames) {
		if (list == null) {
			return Collections.emptyList();
		}
		if (fieldNames == null || fieldNames.length <= 0) {
			return Collections.emptyList();
		}
		List<Kv> kvList = new ArrayList<Kv>();
		for (T t : list) {
			kvList.add(bean(t, fieldNames));
		}
		return kvList;
	}

	private static Kv setValue(Object t, Kv kv, String fieleNames) {
		if (kv == null) {
			kv = Kv.create();
		}

		String fieldName = fieleNames;
		int pos = fieldName.indexOf('.');
		if (pos >= 0) {
			fieldName = fieldName.substring(0, pos);
		}
		Object value = null;
		try {
			value = ReflectUtil.getValueByFieldName(t, fieldName);
		} catch (Exception e) {
		}
		if (value == null) {
			if (ReflectUtil.getFieldByFieldName(t, fieldName) != null) {
				kv.set(fieldName, null);
			}
			return kv;
		}
		kv.set(fieldName, pos >= 0 ? setValue(value, (Kv) kv.get(fieldName), fieleNames.substring(pos + 1)) : value);
		return kv;
	}
}



演示代码如下:

Device device = new Device();
DeviceModel model = new DeviceModel();
model.setId(1);
model.setName("666MODEL");
model.setSoftware("V1.0.0");
AdminUser user = new AdminUser();
user.setEmail("email");
user.setPassword("123123123");
model.setCreatedBy(user);
device.setModel(model);
device.setDeviceId("564654673412121");
System.out.println(BeanCutUtil.bean(device, "deviceId", "id", "model.name", "model.software", "model.createdBy.password"));

打印结果:

{model={software=V1.0.0, createdBy={password=123123123}, name=666MODEL}, id=null, deviceId=564654673412121}


评论区

山东小木

2018-11-27 21:27

有些时候可以在sql上只获取需要的字段就可以,如果拿到数据库返回的是所有字段,一种是可以使用你这种方式处理 但如果使用fastJson这类工具 是支持过滤的 可以通过配置fastJson的Filter实现一样的效果

HingLo

2018-11-27 21:30

如果使用的是model 的话 ,其实可以是可以将model 转为一个Record 然后,直接remove掉不需要的字段就好了,因为作者过滤了请求,所以 我没法发代码给你看,因为它过滤了一下符号.导致代码是错误的

潇洒太爷

2018-11-28 09:48

@山东小木 在sql上过滤,考虑过,但是有时候同一个sql请求,要写两次获取不同字段,感觉也难受

潇洒太爷

2018-11-28 09:48

@HingLo remove可以的,但是我这个是有点针对spring这一类的Bean,因为公司目前也有在用spring,spring的Bean对象就没法remove了

寻真宁

2018-11-28 11:46

有抽取值,再有个过滤值呗,感觉有些时候敏感字段的不会很多

热门分享

扫码入社