设为首页 收藏本站
查看: 637|回复: 0

[经验分享] 重写org.apache.commons.beanutils.PropertyUtilsBean的copyPropert

[复制链接]

尚未签到

发表于 2017-1-10 06:24:50 | 显示全部楼层 |阅读模式
在使用用struts的actionForm时要把属性拷到BO对象时发现org.apache.commons.beanutils.PropertyUtilsBean的copyPropert有些问题:如不能把字符字符串转为Long类型(作为公共工具类本应是这样)为了适应开发需要我重写了copyPropert方法.下面贴出来java 代码

  • package com.zhgrd.basic.util;   
  •   
  • import java.beans.PropertyDescriptor;   
  • import java.lang.reflect.InvocationTargetException;   
  • import java.lang.reflect.Method;   
  • import java.util.Iterator;   
  • import java.util.Map;   
  •   
  • import org.apache.commons.beanutils.BeanUtilsBean;   
  • import org.apache.commons.beanutils.ContextClassLoaderLocal;   
  • import org.apache.commons.beanutils.DynaBean;   
  • import org.apache.commons.beanutils.DynaProperty;   
  • import org.apache.commons.beanutils.PropertyUtils;   
  • import org.apache.commons.beanutils.PropertyUtilsBean;   
  • import org.apache.commons.logging.Log;   
  • import org.apache.commons.logging.LogFactory;   
  • /**  
  •  * 是基于org.apache.commons.beanutils的  
  •  * 便于把form中的值拷到Bo对象中  
  •  * 如Bo中没有的属性在form中存在则不拷贝,  
  •  * 如果目标对象中的属性类型为Long型而拷贝对象为String则把String转为Long  
  •  * @author ou  
  •  *  
  •  */  
  • public class ObjectPropertyUtilsBean extends PropertyUtilsBean{   
  •     Log log = LogFactory.getLog(ObjectPropertyUtilsBean.class);   
  •        
  •        
  •      private static final ContextClassLoaderLocal beansByClassLoader = new ContextClassLoaderLocal() {   
  •                  // Creates the default instance used when the context classloader is unavailable   
  •                  protected Object initialValue() {   
  •                      return new ObjectPropertyUtilsBean();   
  •                  }   
  •              };   
  •     public static ObjectPropertyUtilsBean getInstance(){   
  •         return (ObjectPropertyUtilsBean)beansByClassLoader.get();   
  •     }   
  •     public void copyProperties(Object dest, Object orig)   
  •             throws IllegalAccessException, InvocationTargetException,   
  •             NoSuchMethodException {   
  •   
  •         if (dest == null) {   
  •             throw new IllegalArgumentException ("目标对象为空");   
  •         }   
  •         if (orig == null) {   
  •             throw new IllegalArgumentException("没有拷贝对象");   
  •         }   
  •   
  •         if (orig instanceof DynaBean) {   
  •             DynaProperty origDescriptors[] =   
  •                 ((DynaBean) orig).getDynaClass().getDynaProperties();   
  •             for (int i = 0; i < origDescriptors.length; i++) {   
  •                 String name = origDescriptors.getName();   
  •                 if (dest instanceof DynaBean) {   
  •                     if (isWriteable(dest, name)) {   
  •                         Object value = ((DynaBean) orig).get(name);   
  •                         ((DynaBean) dest).set(name, value);   
  •                     }   
  •                 } else /* if (dest是一个标准的JavaBean) */ {   
  •                     if (isWriteable(dest, name)) {   
  •                         Object value = ((DynaBean) orig).get(name);   
  •                         setSimpleProperty(dest, name, value);   
  •                     }   
  •                 }   
  •             }   
  •         } else if (orig instanceof Map) {   
  •             Iterator names = ((Map) orig).keySet().iterator();   
  •             while (names.hasNext()) {   
  •                 String name = (String) names.next();   
  •                 if (dest instanceof DynaBean) {   
  •                     if (isWriteable(dest, name)) {   
  •                         Object value = ((Map) orig).get(name);   
  •                         ((DynaBean) dest).set(name, value);   
  •                     }   
  •                 } else /* if (dest is a standard JavaBean) */ {   
  •                     if (isWriteable(dest, name)) {   
  •                         Object value = ((Map) orig).get(name);   
  •                         setSimpleProperty(dest, name, value);   
  •                     }   
  •                 }   
  •             }   
  •         } else /* if (orig is a standard JavaBean) */ {   
  •             PropertyDescriptor origDescriptors[] =   
  •                 getPropertyDescriptors(orig);   
  •             for (int i = 0; i < origDescriptors.length; i++) {   
  •                 String name = origDescriptors.getName();   
  •                 if (isReadable(orig, name)) {   
  •                     if (dest instanceof DynaBean) {   
  •                         if (isWriteable(dest, name)) {   
  •                             Object value = getSimpleProperty(orig, name);   
  •                             ((DynaBean) dest).set(name, value);   
  •                         }   
  •                     } else /* if (dest is a standard JavaBean) */ {   
  •                         if (isWriteable(dest, name)) {   
  •                             Object value = getSimpleProperty(orig, name);   
  •                             setSimpleProperty(dest, name, value);   
  •                         }   
  •                     }   
  •                 }   
  •             }   
  •         }   
  •   
  •     }   
  •        
  •        
  •        
  •     public void setSimpleProperty(Object bean,String name, Object value)throws IllegalAccessException, InvocationTargetException,   
  •             NoSuchMethodException {   
  •   
  •         if (bean == null) {   
  •             throw new IllegalArgumentException("对象为空");   
  •         }   
  •         if (name == null) {   
  •             throw new IllegalArgumentException("属性名为空");   
  •         }   
  •   
  •         // Validate the syntax of the property name   
  •         if (name.indexOf(PropertyUtils.NESTED_DELIM) >= 0) {   
  •             throw new IllegalArgumentException ("属性名不规范");   
  •         } else if (name.indexOf(PropertyUtils.INDEXED_DELIM) >= 0) {   
  •             throw new IllegalArgumentException("属性名不规范");   
  •         } else if (name.indexOf(PropertyUtils.MAPPED_DELIM) >= 0) {   
  •             throw new IllegalArgumentException ("属性名不规范");   
  •         }   
  •   
  •         // Handle DynaBean instances specially   
  •         if (bean instanceof DynaBean) {   
  •             DynaProperty descriptor =((DynaBean) bean).getDynaClass().getDynaProperty(name);   
  •             if (descriptor == null) {//不存在该属性   
  •                 return;   
  •             }   
  •             ((DynaBean) bean).set(name, value);   
  •             return;   
  •         }   
  •   
  •         // Retrieve the property setter method for the specified property   
  •         PropertyDescriptor descriptor = getPropertyDescriptor(bean, name);   
  •         if (descriptor == null) {//不存在该属性   
  •             return;   
  •         }   
  •         Method writeMethod = getWriteMethod(descriptor);   
  •         if (writeMethod == null) {   
  •             throw new NoSuchMethodException("属性 '" + name + "' 没有Setter方法");   
  •         }   
  •         Class cl = getPropertyType(bean, name);   
  •         if(value != null)/*在这你可加上把复制对象属性转为目标类属性的代码*/  
  •         if(!cl.getName().equals(value.getClass().getName())){   
  •             if(cl.getName().equals(Long.class.getName())){   
  •                 if(value.getClass().getName().equals(String.class.getName()))   
  •                     value = Long.valueOf((String)value);   
  •                
  •             }   
  •         }   
  •                
  •         // Call the property setter method   
  •         Object values[] = new Object[1];   
  •         values[0] = value;   
  •         invokeMethod(writeMethod, bean, values);   
  •   
  •     }   
  •        
  •     private Object invokeMethod(   
  •             Method method,    
  •             Object bean,    
  •             Object[] values)    
  •                 throws  
  •                     IllegalAccessException,   
  •                     InvocationTargetException {   
  •                 try {   
  •                    
  •                 return method.invoke(bean, values);   
  •                    
  •                 } catch (IllegalArgumentException e) {   
  •                    
  •                 log.error("方法反射失败.", e);   
  •                 throw new IllegalArgumentException(   
  •                     "不能反射: " + method.getDeclaringClass().getName() + "."    
  •                     + method.getName() + " - " + e.getMessage());   
  •                    
  •                 }   
  •             }   
  •   
  •   
  • }   

下面还要写一个类PropertyUtil爆露一个静态方法来使用copyPropertjava 代码

  • package com.zhgrd.basic.util;   
  •   
  • import java.lang.reflect.InvocationTargetException;   
  • import org.apache.commons.beanutils.PropertyUtils;   
  •   
  •   
  • public class PropertyUtil extends PropertyUtils{   
  •      public static void copyProperties(Object dest, Object orig) throws IllegalAccessException, InvocationTargetException,   
  •      NoSuchMethodException {   
  •              ObjectPropertyUtilsBean.getInstance().copyProperties(dest, orig);   
  •     }   
  • }   

好了现在可以使用了.java 代码

  •         SysUserForm tform = (SysUserForm)form;   
  •         try{   
  •             PropertyUtil.copyProperties(tsysUser, tform);   
  •         }catch(Exception ex){   
  •             logger.debug("属性拷贝异常:");   
  •             ex.printStackTrace();   
  • }  

  仅供学习.本人不保证上面代码正确.

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-326135-1-1.html 上篇帖子: [转]使用 Apache MINA 2 框架开发网络应用 下篇帖子: Apache+PHP5+MySQL4(5)+PHPMyAdmin 的简易安装配
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表