当 _MappingKit.java 与Model不在同一级目录时出现的问题

如果题,当 _MappingKit.java 与Model不在同一级目录时,生成的_MappingKit.java 文件会提示需要引包。

//指定model的包名
String modelPackageName = "com.demo.common.model";
//指定_MappingKit.java的包名
String mappingKitPackageName = "com.demo.utils";
//指定 MappingKitOutputDir
String mappingKitOutputDir = ROOT_PATH + "com/demo/utils";
Generator generator = new Generator(dataSource, baseModelPackageName, baseModelOutputDir, modelPackageName, modelOutputDir);
generator.setMappingKitOutputDir(mappingKitOutputDir);
generator.setMappingKitPackageName(mappingKitPackageName);

我知道,像我这样,喜欢把model跟util分开的人肯定很少。不过,还是提出来,跟大伙探讨一下。

一些想法涉及到源码修改,欢迎指正!

1.修改 MappingKitGenerator 类如下
    //在 com.jfinal.plugin.activerecord.generator.MappingKitGenerator 类中新增一个属性
    //该属性可以重载一个构造函数进行赋值
    protected String baseModelPackageName;
    //在generate方法中注入baseModelPackageName
    public void generate(List<TableMeta> tableMetas) {
        System.out.println("Generate MappingKit file ...");
        System.out.println("MappingKit Output Dir: " + this.mappingKitOutputDir);
        Kv data = Kv.by("mappingKitPackageName", this.mappingKitPackageName);
        data.set("mappingKitClassName", this.mappingKitClassName);
        data.set("tableMetas", tableMetas);
        //设置 baseModelPackageName
        data.set("baseModelPackageName", this.baseModelPackageName);
        String ret = this.engine.getTemplate(this.template).renderToString(data);
        this.writeToFile(ret);
    }
2.修改 mapping_kit_template.jf 模板如下
package #(mappingKitPackageName);

import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
//在此处设置并引入model包
import #(baseModelPackageName).*;

/**
 * Generated by JFinal, do not modify this file. test
 * <pre>
 * Example:
 * public void configPlugin(Plugins me) {
 *     ActiveRecordPlugin arp = new ActiveRecordPlugin(...);
 *     #(mappingKitClassName).mapping(arp);
 *     me.add(arp);
 * }
 * </pre>
 */
public class #(mappingKitClassName) {

    public static void mapping(ActiveRecordPlugin arp) {
    #for (tableMeta : tableMetas)
        #if (tableMeta.primaryKey.contains(","))
        // Composite Primary Key order: #(tableMeta.primaryKey)
        #end
        arp.addMapping("#(tableMeta.name)", "#(tableMeta.primaryKey)", #(tableMeta.modelName).class);
    #end
    }
}


评论区

山东小木

2019-06-13 14:58

一个自动生成的文件 没必要强迫症哦

myJob

2019-06-13 15:20

@山东小木 确实,只是因为有setMappingKitOutputDir跟setMappingKitPackageName两个方法,假设设置的路径跟model不在同一级里,就需要手动引入一下包。

JFinal

2019-06-13 15:45

@myJob 将 mapping_kit_template.jf 模板文件复制出来,然后改成自己需要的,最后配置一下:
generator.setMappingKitTemplate(...);

这样生成出来的就可以了

热门反馈

扫码入社