JFinal 3.0 Template Engine getSql()返回null

波总你好,我打算把之前2.0的项目迁移到3.0上面,并且使用3.0的sql模板

我已经在config中配置了好路径,并且调试进去也加载sqlkit中。但是我在model AdvertStartpage中 getSql("getValidAdvertStartpage"); 就是返回空,我跟踪进去发现这个model中的sqlkit不同于刚才config中那个。还望各位大神指导下,谢谢!

config:


    @Override
    public void configPlugin(Plugins me) {
        // TODO Auto-generated method stub
        // 配置数据库连接池插件 Druid
        DruidPlugin druidPlugin = new DruidPlugin(ConfigKit.get("jdbc.url"), ConfigKit.get("jdbc.username"), ConfigKit.get("jdbc.password"),
                ConfigKit.get("jdbc.driver"));
        druidPlugin.addFilter(new WallFilter());//配置防御SQL注入攻击
        druidPlugin.addFilter(getStatFilter());//打开Druid的监控统计功能
        me.add(druidPlugin);

        // 配置ActiveRecordPlugin
        ActiveRecordPlugin arpMysql = new ActiveRecordPlugin("mysql",druidPlugin);
        arpMysql.setBaseSqlTemplatePath(PathKit.getRootClassPath());
        arpMysql.addSqlTemplate("acr.sql");
        me.add(arpMysql);
        
        // 添加自动绑定model与表插件
        AutoTableBindPlugin autoTableBindPlugin = new AutoTableBindPlugin(druidPlugin, TableNameStyle.LOWER_UNDERLINE);
        autoTableBindPlugin.setShowSql(true);
        autoTableBindPlugin.setDialect(new MysqlDialect());// 配置MySql方言
        autoTableBindPlugin.setContainerFactory(new CaseInsensitiveContainerFactory(true));
        me.add(autoTableBindPlugin);
        
        // 缓存插件
        me.add(new EhCachePlugin());
    }


acr.sql

#sql("getValidAdvertStartpage")
    SELECT  * from table

#end

Model:

public class AdvertStartpage extends BaseModel<AdvertStartpage> {
    public static final AdvertStartpage dao = new AdvertStartpage();

    public List<AdvertStartpage> getValidAdvertStartpage() {
        System.out.println(getSql("getValidAdvertStartpage") );
        return find(getSql("getValidAdvertStartpage"));
    }

}

评论区

JFinal

2017-03-31 19:18

详细的异常是什么? 去掉 自动绑定的那个插件试试

bailizi

2017-03-31 19:28

没有异常。就是getSql 返回空,就崩溃了。我刚才去掉了自动绑定,是可以的成功的
public static void mapping(ActiveRecordPlugin arp) {
arp.addMapping("advert_startpage", "id", AdvertStartpage.class);
arp.addMapping("advert_slide", "id", AdvertSlide.class);
}
如果使用自动绑定 就有了问题。不知道问题在哪来,麻烦指导一下,谢谢!
;/***
* 自动绑定model与数据库表
*/
public class AutoTableBindPlugin extends ActiveRecordPlugin {
private TableNameStyle tableNameStyle;

public AutoTableBindPlugin(DataSource dataSource) {
super(dataSource);
}

public AutoTableBindPlugin(IDataSourceProvider dataSourceProvider, TableNameStyle tableNameStyle) {
super(dataSourceProvider);
this.tableNameStyle = tableNameStyle;
}

@SuppressWarnings({ "rawtypes", "unchecked" })
@Override
public boolean start() {
try {
List modelClasses = ClassKit.findClasses(BaseModel.class);
TableBind tb = null;
for (Class modelClass : modelClasses) {
tb = (TableBind) modelClass.getAnnotation(TableBind.class);
if (tb == null) {
this.addMapping(tableName(modelClass), modelClass);
} else {
if (StrKit.notBlank(tb.name())) {
if (StrKit.notBlank(tb.pk())) {
this.addMapping(tb.name(), tb.pk(), modelClass);
} else {
this.addMapping(tb.name(), modelClass);
}
} else {
if (StrKit.notBlank(tb.pk())) {
this.addMapping(tableName(modelClass), tb.pk(), modelClass);
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
return super.start();
}

@Override
public boolean stop() {
return super.stop();
}

// 根据类名生成Table名
private String tableName(Class clazz) {
String tableName = clazz.getSimpleName();
if (tableNameStyle == TableNameStyle.UP) {
tableName = tableName.toUpperCase();
} else if (tableNameStyle == TableNameStyle.LOWER) {
tableName = tableName.toLowerCase();
} else if (tableNameStyle == TableNameStyle.LOWER_UNDERLINE) {
tableName = tableName.replaceAll("[A-Z]", "_$0");
tableName = tableName.substring(1, tableName.length()).toLowerCase();
} else {
tableName = StrKit.firstCharToLowerCase(tableName);
}
String tablePrefix = ConfigKit.get("jdbc.dbPrefix");
if (!StrKit.isBlank(tablePrefix))
tableName = tablePrefix + tableName;
System.out.println("DATABASE_TABLE_MAPPING---->" + clazz.getName() + "=>" + tableName);
return tableName;
}
}

bailizi

2017-03-31 19:36

@波总。我把这个AutoTableBindPlugin 改成一个一般的类,然后直接调用start 就没有问题了。。。这个是不是什么异步导致的问题。

JFinal

2017-03-31 20:53

@bailizi 不了解 AutoTableBindPlugin 的工作机制,jfinal 官方并没有推出这个插件,使用 jfinal 官方的 Generator 可以全自动搞定 model 生成与 table 映射

热门反馈

扫码入社