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 13:33
@静静滴疯 方言是对应于某个 ActiveRecordPlugin,而 dataSource 也是对应于某个 ActiveRecordPlugin,对应关系需要使用 configName 来做,在创建 ActiveRecordPlugin 时需要为其指定一个 configName
2016-12-02 12:47
@静静滴疯 截图中的字符是 "`" 而不是 "'" ,注意看一下,终级解决方案是单步调试程序,看一下 batchSave() 方法内部用的 Config 对象中的 dialect 到底是什么类型,一目了然
2016-12-02 12:26
@静静滴疯 看了一下异常,很明显你是将 postgresql 的方言设置成了 mysql 方言