动态对象(DynamicObject)与普通Java对象转换工具原创
金蝶云社区-悬浮
悬浮
10人赞赏了该文章 2,238次浏览 未经作者许可,禁止转载编辑于2023年01月14日 19:01:04
summary-icon摘要由AI智能服务提供

苍穹平台提供低代码开发能力,通过动态对象统一单据对象属性差异,但动态对象在跨模块协作中因可变性和属性不明确而不适用。为此,需封装动态对象与Java对象间的转换工具,通过定义配置注解与开发转换工具实现属性自动转换。示例展示了如何通过注解配置对象属性转换,并使用转换工具在动态对象与Java对象间互相转换,确保接口定义明确且灵活操作数据。

一、概述

        苍穹平台提供了低代码开发的能力,通过动态对象统一了各单据、各对象在属性上的差异,实现了对象的统一管理。但是在部分场景(例如接口)中由于动态对象的可变性和属性信息不明确的特性,因此动态对象不太适合跨模块协作。为了明确接口定义的输入及输出,一般使用Java对象作为数据传输对象,但是在苍穹平台上又是以动态对象的方式进行数据操作,这就有必要封装一个动态对象跟普通Java对象之间的转换,实现两者之间属性的自动转换和映射。


二、设计思路

1、定义配置注解,用于动态对象与普通java对象的映射关系。

2、开发转换工具,实现动态对象转Java对象和Java对象转动态对象。


三、代码实现

1、定义配置注解,用于动态对象与普通java对象的映射关系。

/**
 * 对象属性转换配置注解,用于动态对象与常规Java对象的转换配置
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface ConvertConfig {
    /**
     * 动态对象标识
     *
     * @return
     */
    String name();
}

/**
 * 对象属性转换配置注解,用于动态对象与常规Java对象的转换配置,将动态对象属性名与java对象属性名进行映射。
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface ConvertPropertyConfig {

    /**
     * 动态对象标识
     *
     * @return
     */
    String fieldId();
}


2、开发转换工具,实现动态对象转Java对象和Java对象转动态对象。

/**
 * 对象属性转换工具
 */
public class ConvertObjectHelper {

    /**
     * 动态对象转java对象
     *
     * @param dynamicObject 动态对象
     * @param tClass        java类对象
     * @param <T>
     * @return
     * @throws IllegalAccessException
     * @throws InstantiationException
     */
    public static <T> T convertFromDynamicObject(DynamicObject dynamicObject, Class<T> tClass) throws IllegalAccessException, InstantiationException {
        //获取声明的属性
        Field[] fields = tClass.getDeclaredFields();
        //创建返回对象
        T instance = tClass.newInstance();
        //赋值处理
        for (Field field : fields) {
            ConvertPropertyConfig property = field.getAnnotation(ConvertPropertyConfig.class);
            if (property != null) {
                String fieldId = property.fieldId();
                //写入
                field.setAccessible(true);
                field.set(instance, dynamicObject.get(fieldId));
            }
        }
        return instance;
    }


    /**
     * java对象转动态对象
     *
     * @param data java对象
     * @param <T>
     * @return
     * @throws IllegalAccessException
     * @throws InstantiationException
     */
    public static <T> DynamicObject convertToDynamicObject(T data) throws IllegalAccessException, InstantiationException {
        //数据为空
        if (data == null || data.getClass().getAnnotation(ConvertConfig.class) == null) {
            return null;
        }
        //获取注解配置信息
        ConvertConfig config = data.getClass().getAnnotation(ConvertConfig.class);
        //调用重载的方法转换为动态对象
        return convertToDynamicObject(config.name(), data);
    }


    /**
     * java对象转动态对象
     *
     * @param dyName 动态对象标识名
     * @param data   java对象
     * @param <T>
     * @return
     * @throws IllegalAccessException
     * @throws InstantiationException
     */
    public static <T> DynamicObject convertToDynamicObject(String dyName, T data) throws IllegalAccessException, InstantiationException {
        //创建动态对象
        DynamicObject dynamicObject = new DynamicObject(EntityMetadataCache.getDataEntityType(dyName));
        //获取声明的属性
        Field[] fields = data.getClass().getDeclaredFields();
        //赋值处理
        for (Field field : fields) {
            ConvertPropertyConfig property = field.getAnnotation(ConvertPropertyConfig.class);
            if (property != null) {
                //写入
                field.setAccessible(true);
                dynamicObject.set(property.fieldId(), field.get(data));
            }
        }
        return dynamicObject;
    }
}


四、运用示例

java对象

@ConvertConfig(name = "kd65_student")
public class Student {

    @ConvertPropertyConfig(fieldId = "id")
    private Long id;
    @ConvertPropertyConfig(fieldId = "kd_name")
    private String name;
    @ConvertPropertyConfig(fieldId = "kd_age")
    private Integer age;

    public Student() {
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}


运用示例代码

String dyName = "kd65_student";
DynamicObject dy = new DynamicObject(EntityMetadataCache.getDataEntityType(dyName));
dy.set("id", 100000L);
dy.set("kd_name", "张三");
dy.set("kd_age", 18);
Student s1 = ConvertObjectHelper.convertFromDynamicObject(dy,Student.class);
System.out.println("s1:"+s1);
System.out.println("将s1转换为动态对象object1");
DynamicObject object1 = ConvertObjectHelper.convertToDynamicObject(s1);
System.out.println("再将动态对象object1转换为s2");
Student s2 = ConvertObjectHelper.convertFromDynamicObject(object1,Student.class);
System.out.println("s2:"+s2);
System.out.println("将s2转换为动态对象object2");
DynamicObject object2 = ConvertObjectHelper.convertToDynamicObject(dyName,s2);
System.out.println("再将动态对象object2转换为s3");
Student s3 = ConvertObjectHelper.convertFromDynamicObject(object2,Student.class);
System.out.println("s3:"+s3);


输出:

image.png


动态对象元数据定义

image.png

图标赞 10
10人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!