利用反射机制处理保存上游系统推送较多字段的情况

0、背景

从第三方网站获取到每日的交易数据,然后将这批数据保存到当前系统数据库内。字段数量不固定(有的日数据可能返回80多个字段,有的可能是100多个字段),同时字段数量较多(最大范围在120个字段)。

1、处理思路

将实体字段设置注解,然后同步过来的数据,根据字段的值与注解内容进行匹配,如果匹配一致保存到实体内。

2、代码

2.1、实体以及注解设计
@Data
@TableName("core_data")
public class CoreDataEntity implements Serializable {
	private static final long serialVersionUID = 1L;

	...
	/**
	 * 数据入库时间
	 */
	@CoreDateField(name = "create_time",value = "createTime",ch = "入库时间")
	private Date createTime;
	/**
	 * 日期
	 */
	@CoreDateField(name = "date",value = "date",ch = "日期")
	private String date;
	/**
	 * 时间
	 */
	@CoreDateField(name = "time",value = "time",ch = "时间")
	private String time;
	/**
	 * 计划名称
	 */
	@CoreDateField(name = "campaign_name",value = "campaignName",ch = "计划名称")
	private String campaignName;
	...

其中CoreDateField为主要注释的注解
name:内容对应数据库表字段
value:内容对应实体字段(涉及到其他业务场景而创建的)
ch:内容对应中文含义(涉及到其他业务场景而创建的)

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface CoreDateField {
    String name() default "";
    String value() default "";
    String ch() default "";
}
2.2、同步后获取数据的代码

jsonArray为从上游系统同步过来的数据内容

private static List<CoreDataEntity> buildCoreDataList(JSONArray jsonArray){
    List<CoreDataEntity> coreDataList = new ArrayList<>();
    for (int i = 0; i < jsonArray.size(); i++) {
        try {
            Class<?> cls = CoreDataEntity.class;
            Object instance = cls.newInstance();
            JSONObject jsonObject = jsonArray.getJSONObject(i);
            Set<String> strings = jsonObject.keySet();
            //获取全部字段
            Field[] fields = cls.getDeclaredFields();
            //根据字段上的注解找到对应的数据库保存字段,然后去匹配是否存在这个字段,如果存在那么就调用set方法
            for (Field field : fields) {
                if (field.isAnnotationPresent(CoreDateField.class)) {
                    CoreDateField annotation = field.getAnnotation(CoreDateField.class);
                    String fieldName = annotation.name();
                    String fieldValue = annotation.value();
                    if (strings.contains(fieldName)) {
                        //如果字段存在于本次查询到的数据内的话,获取其值,并调用set方法保存
                        Object str = jsonObject.get(fieldName);
                        String methodName = "set" + Character.toUpperCase(fieldValue.charAt(0)) + fieldValue.substring(1);
                        Method method = cls.getMethod(methodName, String.class);
                        method.invoke(instance,String.valueOf(str));
                    }
                }
            }
            coreDataList.add((CoreDataEntity) instance);
        } catch (Exception e) {
            e.getStackTrace();
        }
    }
    return coreDataList;
}

3、最后

此方案可以避免手写多个get、set方案,同时若后期上游系统新增字段,可以直接修改代码内实体内容,并新增注解对应内容即可。处理方案为个人浅见,希望各位大佬有更好的方案可以不吝赐教。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值