gteric 发表于 2017-1-10 06:24:50

重写org.apache.commons.beanutils.PropertyUtilsBean的copyPropert

在使用用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;   
[*]        values = 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]
查看完整版本: 重写org.apache.commons.beanutils.PropertyUtilsBean的copyPropert