复制表单验证对象数据

发布于 2019-01-18  468 次阅读


import org.springframework.beans.BeanUtils;
import org.springframework.beans.BeansException;
import org.springframework.beans.FatalBeanException;

import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

/**
 * 复制表单验证对象数据
 */
public class FormBeanUtil {
    // 忽略的Bean属性
    private static String[] defaultIgnoreProperties = new String[]{
            "createDate",
            "updateDate",
            "createBy",
            "updateBy",
            "status"
    };

    /**
     * 封装spring的BeanUtils工具对象,忽略部分Bean属性
     * @param source 源对象
     * @param target 目标对象
     */
    public static void copyProperties(Object source, Object target) throws BeansException {
        BeanUtils.copyProperties(source, target, defaultIgnoreProperties);
        referenceEntity(source, target);
    }

    /**
     * 封装spring的BeanUtils工具对象,自定义忽略Bean属性
     * @param source 源对象
     * @param target 目标对象
     */
    public static void copyProperties(Object source, Object target, String... ignoreProperties) throws BeansException {
        // 合并两个数组
        String[] jointIgnoreProperties = new String[defaultIgnoreProperties.length + ignoreProperties.length];
        System.arraycopy(defaultIgnoreProperties, 0, jointIgnoreProperties, 0, defaultIgnoreProperties.length);
        System.arraycopy(ignoreProperties, 0, jointIgnoreProperties, defaultIgnoreProperties.length, ignoreProperties.length);
        BeanUtils.copyProperties(source, target, jointIgnoreProperties);
        referenceEntity(source, target);
    }


    /**
     * 将实体对象装入验证对象中
     * @param source 源对象
     * @param target 目标对象
     */
    private static void referenceEntity(Object source, Object target){
        PropertyDescriptor sourcePd = BeanUtils.getPropertyDescriptor(source.getClass(), "entity");
        if(sourcePd != null){
            Method writeMethod = sourcePd.getWriteMethod();
            if(writeMethod != null){
                if (!Modifier.isPublic(writeMethod.getDeclaringClass().getModifiers())) {
                    writeMethod.setAccessible(true);
                }
                try {
                    writeMethod.invoke(source, target);
                } catch (IllegalAccessException | InvocationTargetException e) {
                    throw new FatalBeanException("无法将实体对象装入认证对象中");
                }
            }
        }
    }
}

公交车司机终于在众人的指责中将座位让给了老太太