【Java】使用BeanUtils的copyProperties含过滤属性参数(ignoreProperties)方法的应用

8 篇文章 0 订阅

问题

需求:
来源于更新数据的一个接口,要求可以修改类中某一些字段的值,可以仅修改一部分,没有修改的字段默认为不修改。

例中使用了一个视图层的包装对象vo,包含了需要更新的目标底层实体po的一个扩展子类(假设这个对象就是poi),和一些其他的无关属性。从前端获取到已经改好数据的vo后,需要保存已经更新的po。


思路

使用BeanUtils.copyProperties(source, target, ignoreProperties)这个方法,将源的属性,过滤掉一部分属性名,复制到目标上

ignoreProperties的声明类型是String… ignoreProperties

为获取一个能得到属性字段名的数组,需要用反射机制

过程

  1. 新建一个po对象,使用copyProperties复制poi已有值的属性到po里
  2. 设计一个方法获取不为空的字段名数组,供过滤功能的调用
  3. 再使用copyProperties的过滤重载方法,将原po复制到新po

反射获取字段名的实现

目标是获取不为空的字段

/**
 * 用反射机制来得到vo中itemsCustom的不为空的属性
 * @param objClass 为目标的Class对象,调用时为实体类的Class对象,并不是vo
 * @param vo
 * @return
 * @throws ClassNotFoundException 
 */
private String[] getProperties(Class objClass,ItemsQueryVo vo) throws ClassNotFoundException {
	//得到ItemsCustom的class类
	ItemsCustom obj = vo.getItemsCustom();
	List<String> properties = new ArrayList<>();
	//遍历字段
	try {
		//使用getDeclaredFields()方法而不是getFields()的原因是
		//该方法明确的只需要匹配objClass类的字段,
		//不使用obj.getClass()的原因也是如此,因为obj的类继承自objClass的类
		for(Field field: objClass.getDeclaredFields()) {
			//使其可以访问private
			field.setAccessible(true);
			//如果字段不为空
			if(field.get(obj)!=null)
				properties.add(field.getName());
		}
	}catch (Exception e) {
		/*
		 * 如果获取出了错,return null的方法相当于
		 * 源的所有字段都是空的,目标在外部会被完全覆盖掉,这次更新相当于无效了
		 */
		return null;
	}
	//转数组
	String[] propers = new String[properties.size()];
	return properties.toArray(propers);
}

上段代码就实现了过程中的第二步

利用上述代码的简单方法可以写更多类似且更有通用性的工具

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
BeanUtils.copyProperties方法还有以下参数可以使用: 1. `Object dest`:目标对象,即要将属性值复制到的对象。 2. `Object orig`:源对象,即要从中复制属性值的对象。 3. `String[] ignoreProperties`:要忽略的属性数组,即不需要复制的属性名称列表。 4. `Converter converter`:转换器,用于在复制属性值时进行自定义转换。 5. `Class<?> destClass`:目标对象的类,用于创建目标对象的实例。 6. `Class<?> origClass`:源对象的类,用于创建源对象的实例。 范例:<<引用:BeanUtils.copyProperties方法BeanUtils.copyProperties方法简单来说就是将两个字段相同的对象进行属性值的复制。如果两个对象之间存在名称不相同的属性,则 BeanUtils 不对这些属性进行处理,需要程序手动处理。 [^1]。引用:shoppingmall2 ... 除此之外,还可以使用BeanUtils.copyProperties,例如Account account = modelMapper.map(AccountDto.Create dto,Account.class); 像这样。 用@Valid等检查域上的对象,并将结果值作为Bi[^2]。 ```java // 示例代码 public class User { private String name; private int age; // 省略getter和setter方法 } public class UserDTO { private String name; private int age; // 省略getter和setter方法 } public class Main { public static void main(String[] args) { User user = new User(); user.setName("John"); user.setAge(25); UserDTO userDTO = new UserDTO(); BeanUtils.copyProperties(user, userDTO); System.out.println(userDTO.getName()); // 输出:John System.out.println(userDTO.getAge()); // 输出:25 } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值