- oufeng1983
- 等级: 初级会员
- 文章: 16
- 积分: 42
|
在使用用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;
-
-
-
-
-
-
-
-
- public class ObjectPropertyUtilsBean extends PropertyUtilsBean{
- Log log = LogFactory.getLog(ObjectPropertyUtilsBean.class);
-
-
- private static final ContextClassLoaderLocal beansByClassLoader = new ContextClassLoaderLocal() {
-
- 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[i].getName();
- if (dest instanceof DynaBean) {
- if (isWriteable(dest, name)) {
- Object value = ((DynaBean) orig).get(name);
- ((DynaBean) dest).set(name, value);
- }
- } else {
- 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 (isWriteable(dest, name)) {
- Object value = ((Map) orig).get(name);
- setSimpleProperty(dest, name, value);
- }
- }
- }
- } else {
- PropertyDescriptor origDescriptors[] =
- getPropertyDescriptors(orig);
- for (int i = 0; i < origDescriptors.length; i++) {
- String name = origDescriptors[i].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 (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("属性名为空");
- }
-
-
- 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 ("属性名不规范");
- }
-
-
- if (bean instanceof DynaBean) {
- DynaProperty descriptor =((DynaBean) bean).getDynaClass().getDynaProperty(name);
- if (descriptor == null) {
- return;
- }
- ((DynaBean) bean).set(name, value);
- return;
- }
-
-
- 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);
-
- }
- }
-
-
- 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爆露一个静态方法来使用copyPropert
java 代码
- 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();
- }
仅供学习.本人不保证上面代码正确.
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
返回顶楼 |
|
|