`
happyqing
  • 浏览: 3199029 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

spring BeanUtils.copyProperties只拷贝不为null的属性

阅读更多

 

在MVC的开发模式中经常需要将model与pojo的数据绑定,apache和spring的工具包中都有BeanUtils,使用其中的copyProperties方法可以非常方便的进行这些工作,但在实际应用中发现,对于null的处理不太符合个人的需要,例如在进行修改操作中只需要对model中某一项进行修改,那么一般我们在页面上只提交model的ID及需要修改项的值,这个时候使用BeanUtils.copyProperties会将其他的null绑定到pojo中去。为解决这个问题我重写了部分spring BeanUtils的代码如下

 

spring: 3.2.12,其他几个copyProperties方法最终都是调用的这个,

spring的比apache的的多一个带ignoreProperties的

private static void copyProperties(Object source, Object target, Class<?> editable, String... ignoreProperties)
		throws BeansException {

	Assert.notNull(source, "Source must not be null");
	Assert.notNull(target, "Target must not be null");

	Class<?> actualEditable = target.getClass();
	if (editable != null) {
		if (!editable.isInstance(target)) {
			throw new IllegalArgumentException("Target class [" + target.getClass().getName() +
					"] not assignable to Editable class [" + editable.getName() + "]");
		}
		actualEditable = editable;
	}
	PropertyDescriptor[] targetPds = getPropertyDescriptors(actualEditable);
	List<String> ignoreList = (ignoreProperties != null) ? Arrays.asList(ignoreProperties) : null;

	for (PropertyDescriptor targetPd : targetPds) {
		Method writeMethod = targetPd.getWriteMethod();
		if (writeMethod != null && (ignoreProperties == null || (!ignoreList.contains(targetPd.getName())))) {
			PropertyDescriptor sourcePd = getPropertyDescriptor(source.getClass(), targetPd.getName());
			if (sourcePd != null) {
				Method readMethod = sourcePd.getReadMethod();
				if (readMethod != null &&
						ClassUtils.isAssignable(writeMethod.getParameterTypes()[0], readMethod.getReturnType())) {
					try {
						if (!Modifier.isPublic(readMethod.getDeclaringClass().getModifiers())) {
							readMethod.setAccessible(true);
						}
						Object value = readMethod.invoke(source);
						if(value != null){	//只拷贝不为null的属性 by zhao
							if (!Modifier.isPublic(writeMethod.getDeclaringClass().getModifiers())) {
								writeMethod.setAccessible(true);
							}
							writeMethod.invoke(target, value);
						}
					}
					catch (Throwable ex) {
						throw new FatalBeanException(
								"Could not copy property '" + targetPd.getName() + "' from source to target", ex);
					}
				}
			}
		}
	}
}

 关键代码就是加一个判断

                        if(value != null){  //只拷贝不为null的属性 by zhao   
                            if (!Modifier.isPublic(writeMethod.getDeclaringClass().getModifiers())) {   
                                writeMethod.setAccessible(true);   
                            }   
                            writeMethod.invoke(target, value);   
                        }

 

参考:http://simen-net.iteye.com/blog/644801

分享到:
评论

相关推荐

    BeanMapper:比BeanUtils.copyProperties更快

    一个BeanUtils.copyProperties的小型快速替代。 起因 由于BeanUtils(Spring或Apache Commons)的copyProperties实现是利用反射实现的,它在大量调用时具有比较严重的性能问题。 BeanMapper通过javassist类库实现在...

    如何使用BeanUtils.copyProperties进行对象之间的属性赋值

    需要注意的是,`BeanUtils.copyProperties`并不处理属性的深拷贝,也就是说,如果源对象或目标对象的某个属性是一个复杂类型(如另一个对象),那么这个属性将进行引用拷贝,而不是创建一个新的复杂类型实例。...

    java Beanutils.copyProperties( )用法详解

    需要注意的是,BeanUtils.copyProperties() 方法要求两个对象的属性名称相同,如果属性名称不同,BeanUtils.copyProperties() 方法将不会进行赋值。例如,如果 User 对象中有一个 createDate 属性,而 ...

    BeanUtilsBean对象复制使用(类型可以自动转化)

    `BeanUtilsBean.copyProperties()`方法是实现此功能的关键,它允许我们将一个JavaBean的所有属性值复制到另一个具有相同属性的JavaBean中。 `BeanUtilsBean`的`copyProperties()`方法的工作原理如下: 1. **目标与...

    commons-beanutils.jar.zip

    1. **属性拷贝**:BeanUtils.copyProperties()方法可以实现两个JavaBean对象之间的属性值拷贝,极大地减少了代码量。 2. **动态属性访问**:通过BeanUtils.getProperty()和BeanUtils.setProperty(),我们可以动态地...

    org.apache.commons.beanutils.jar

    2. **类型转换**:BeanUtils能够自动进行类型转换,这意味着即使源对象和目标属性类型不匹配,也能尝试将源值转换为适当的类型。例如,将字符串转换为整数或日期等。 3. **复制属性**:`copyProperties()`方法允许...

    [] - 2022-11-22 使用 BeanUtils.copyProperties 踩坑经历.pdf

    互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术...

    commons-beanutils-1.8.0.jar beanutils.jar beanutils.jar工具包

    commons-beanutils-1.8.0.jar beanutils.jar beanutils.jar工具包

    BeanUtils.jar

    1. **属性复制**:BeanUtils.copyProperties()是其最常用的功能之一,它能将一个对象的所有属性值复制到另一个对象中,大大减少了手动赋值的工作。 2. **类型转换**:BeanUtils.setProperty()和BeanUtils....

    org.apache.commons.beanutils.BeanUtils实例

    此为BeanUtils的实例。其中apache的包有一个小的BUG已在其中说明。

    commons-beanutils.jar下载

    commons-beanutils.jar commons-beanutils.jar

    commons-beanutils.jar

    在上面的例子中,我们看到通过调用`BeanUtils.copyProperties()`,源对象User的属性值被复制到了目标对象。 4. **注意事项** - BeanUtils操作的是public属性,对于private属性,需要对应的getter和setter方法。 ...

    commons-beanutils-1.9.4.jar.zip

    5. **拷贝属性**:`BeanUtils.copyProperties()`方法可以实现对象间的属性深度拷贝,这对于创建对象副本或者在不同对象间传递数据十分便利。 6. **避免空指针异常**:BeanUtils库在处理null值时会进行保护,避免因...

    使用BeanUtils操作属性的一个小坑

    5. **使用BeanUtils.copyProperties()的自定义转换器**:如果属性类型不匹配,可以实现`org.apache.commons.beanutils.Converter`接口,然后通过`registerConverter()`方法注册,使BeanUtils在遇到这种类型转换时...

    commons.jar +commons-beanutils.jar

    标题中的"commons.jar +commons-beanutils.jar"指的是Apache Commons项目中的两个核心组件:commons.jar和commons-beanutils.jar。Apache Commons是Java编程语言中的一系列小型实用程序库,为开发人员提供了各种常见...

    json用到的jar包(commons-beanutils.jar、commons-collections-3.1.jar等)

    json相关jar包(不使用springmvc开发时)。其中包含(commons-beanutils.jar、commons-collections-3.1.jar、commons-lang-2.6.jar、commons-logging.jar、ezmorph-1.0.6.jar、json-lib-2.2.3-jdk15.jar)

Global site tag (gtag.js) - Google Analytics