dataimport导入后台如何二次处理数据?

image
import后,如何二次处理数据;
例如:根据自己的规则,专门设置entity的某个字段值

导入配置中的初始化器( Entity initializer)或者自定义映射都可以为实体属性提供自定义值。
不确定你的问题点在哪里。
能再详细描述一下需求吗?

image
在使用dataimport时,分两步:

  1. 设定配置
  2. 拿到导入的inputStream
    然后调用dataimporter类的方法直接传两个参数导入了,但是我想在次之前,处理一下导入的数据。比如导入的数据对应的entity的字段a我想改成‘当前时间+A’

我理解的要给实体属性设置初始值。如果是这样,使用实体初始化器就行了。文档示例里没有提到。但是源码里有。
参考:

可能需要做一下逻辑校验,code不能重复,我先试试这个方法。

看了一下,没找到方法。还需要指导下 :fist_right:

你好,
描述一下具体的场景,要做什么?目前怎么做的?遇到的问题是什么?

场景:我要做一个导入导出功能,导出已有的数据,编辑后导入且自动生成编码。
例子:
(1)系统中有一批中文语种的区域信息,现在需要加一批英文语种的区域信息,导出所有区域信息,编辑后导入
(2)系统中区域信息已有五种语言,我要加一个冰岛区域。先任意导出一个区域如‘北京’,编辑五种语言后导入。需要后台根据规则自动生成code,如果A201等;且需要校验name=‘冰岛’在系统中不存在

因此,我需要在导入的文件流转换成entity,但未写库时,做一些逻辑操作。

你好,

可以使用实体初始器,这个初始器会应用在每个实体上,可以在初始器中生成code,然后给赋值给指定属性。

根据你的描述,应该是一个前置校验,可以在调用 dataImport 的 API 前写代码进行检验。不需要通过 dataImport 提供接口来检验。

如果上述方法确实不能满足需求,可以扩展DataImportExecutor 组件,重写它的 importEntities() 方法,在这个方法里可以获取到待导入的所有体,然后进行任意逻辑处理。

  protected List<Object> importEntities(List<Object> entitiesToImport) {
        applyEntityInitializer(entitiesToImport);
        List<Object> resultList = new ArrayList<>();
        entitiesToImport.forEach(entityToImport -> {
            EntityImportPlan entityImportPlan = createEntityImportPlan(entityToImport);
            Collection<Object> importedEntities = entityImportExport.importEntities(Collections.singletonList(entityToImport), entityImportPlan, true);
            Collection<Object> filteredImportedEntities = importedEntities.stream()
                    .filter(importedEntity -> (importedEntity.getClass().isAssignableFrom(importConfiguration.getEntityClass())))
                    .collect(Collectors.toList());
            resultList.add(filteredImportedEntities.iterator().next());
        });
        return resultList.stream()
                .map(EntityValues::getId)
                .collect(Collectors.toList());
    }

因为我拿到的是文件流,直接给了dataImporter.importData(importConfiguration, inputStream)
所以前置校验,我应该要将自带的importData分成两个,要写:
(1)拿到转换数据的方法
(2)由转换数据在导入的方法
这样基本重写那个类了?好像不止一个类


我尝试了通过setEntityInitializer能够设置entity的字段:

Consumer<Object> consumer1 = new Consumer<Object>() {
            @Override
            public void accept(Object o) {
                if (o instanceof Area){
                    ((Area) o).setFdIos2("ssss");
                }
            }
        };
        importConfiguration.setEntityInitializer(consumer1);

image

image
重写了这五个类,加了获取后的转换数据保存转换后的数据两个新的方法
image