2016-12-02 18:14

@劲风 前面是指“控制层”拦截器,不是“控制”拦截器。这样整理一下思路,一切都好理解了:
1:拦截器可以用在两个层面,一个是“控制层”,另一个是“业务层”,其中“业务层”是一种狭义的说法,更加合理的说法是“非控制层”,也就是说所有“控制层”之外的情况

2:“控制层”拦截器是指用在 Controller 上的拦截器,“业务层”拦截器是指用在 "非Controller" 的其它地方的拦截器

3:无论什么拦截器都分为三种:global、class、method级

4:控制层拦截器的 global 通过 me.add(...) 添加,非控制层的 global 通过 me.addGlobalServiceInterceptor(...) 添加

5:控制层与非控制层的 class 级拦截器都是通过在紧靠 public class 的地方使用 @Before(...) 添加

6:控制层与非控制层的 method 级拦截器都是通过紧靠在方法声明的地方使用 @Before 添加

7:控制层拦截器是自动触发的,有了上述的添加,会自动触发,非控制层的拦截器需要先通过 Duang.duang(...) 或者 Enhancer.enhance(...) 以后,才能被触发

简单总结起来其实就两点:
1:两类拦截器的配置方式是类似的,唯一不同的是配置全局拦截时调用的方法名不同,一个是 me.add(...) 一个是 me.addGlobalServiceInterceptor(...)

2:控制层拦截器自动触发,而非控制层需要先增强

2016-12-02 16:48

@静静滴疯 我再补充一下,jfinal 生成的 sql 对不同的数据库会在字段名称前后添加不同的转义字符,例如 myslq 是添加 "`",postgresql 是添加 """,这样处理是为了使用字段名可能支持数据库保留字

postgresql 处理保留字的方式就是对字段加双引号,你的 postgresql 不支持双引号,我也是头一回碰到,闻所未闻

2016-12-02 16:41

@静静滴疯 也就是说你的 postgresql 不支持双引号对吧? 解决办法极其简单
1:创建一个public class MyPostgresqlDialect extends PostgresqlDialect,将父类的所有代码 copy 进来,然后将双引号去掉

2:arp.setDialect(MyPostgresqlDialect());

这个问题,可能是你的 postgresql 配置问题,默认是支持双引号的

2016-12-02 16:39

关于业务层拦截器,AppConfig 中配置是指配置全局拦截器,如果你不需要全局拦截器则不需要,这一条与控制层拦截器也是一样的。第二条与控制层拦截器是一样的。只有第三条是业务层独有的,需要对被拦截的类进行一下增强,控制层拦截器是自动增强的,不需要 Duang

2016-12-02 16:37

把这条 sql copy出来,放在控制台能否被正确执行?

2016-12-02 16:36

年底有三个项目着急交付,周末有 jfinal 2.3 要开发,暂时顾不上社区,社区上线马上快半年了,连 jfinal 一万多人的 qq 群都没通知过,想想还有哪位站长会能做得出来

2016-12-02 16:31

批量删早就有了: Db.update("delete from table whre ...", ?, ?, ?) 一行代码搞定

2016-12-02 14:36

@光光哥 单步调试一下,看程序具体的走向,很可能是某个拦截器中有 try catch 之类的吃掉了异常

2016-12-02 13:33

@静静滴疯 方言是对应于某个 ActiveRecordPlugin,而 dataSource 也是对应于某个 ActiveRecordPlugin,对应关系需要使用 configName 来做,在创建 ActiveRecordPlugin 时需要为其指定一个 configName

2016-12-02 13:31

本质就是一个方言设置问题,仔细看下手册

2016-12-02 12:47

@静静滴疯 截图中的字符是 "`" 而不是 "'" ,注意看一下,终级解决方案是单步调试程序,看一下 batchSave() 方法内部用的 Config 对象中的 dialect 到底是什么类型,一目了然

2016-12-02 12:27

不是字符 "'" 而是字符 "`",这个字符是键盘数 1 左边的按钮上的字符,这个是 mysql 专用字符,已经证明了你用的是 mysql dialect,需要改成 PostgreSqlDialect

2016-12-02 12:26

@静静滴疯 看了一下异常,很明显你是将 postgresql 的方言设置成了 mysql 方言

2016-12-02 12:21

多数据源情况,需要为不同数据源设置不同的方言,例如:
dsSqlServer.setDialect(new SqlServerDialect());
pg.setSetDialect(new PostgreSqlDialect());

这样在使用 Db.use(...) 切换到不同的数据源之后, sql 也会被调整

2016-12-02 11:26

还有一种情况注意一下,如果前方有拦截器在拦截请求以后停止了后续调用,则后续拦截器也不会被执行