使用@Before(Tx.class) ,泛型获取报错

求助:

定义了一个BasisService

err1.png

定义TtService继承BasisService

err2.png

上面去掉@Before(Tx.class)的情况下正常,加了则报错


控制器调用

err3.png


报错:

err4.png


去掉@Before(Tx.class)的情况下正常

评论区

JFinal

2019-08-08 21:08

添加 @Before(Tx.class) 以后,jfinal 会生成代理实现 AOP,那么你的那个出错的方法得到的 class 类型就不对了,将 getClazz() 方法内部按下面的办法改进一下,大致如下:
getClazz() {
Class c = getClass();
if (c.getSimpleName().indexOf("$$Enhancer") != -1) {
c = getSuperclass();
}
Type t = c.getGenericSuperclass();
// 后面的代码不变

大致的意思是,先获取一次 getClass() 看这个类是不是 jfinal 生成的代理类,如果类名中包含 "$$Enhancer" 则是生成的代理

如果确实是代理,则调用一次 getSuperclass() 获取其父类,至此的流程就对上了你以前的代码了

记得搞定后回来反馈一下

lzw0128

2019-08-08 22:58

@JFinal 是的,重新用getClass().getSuperclass()获取多一次就可以了。感谢波哥!!!

lzw0128

2019-08-08 23:03

@JFinal 还有个问题,我想用TableMapping.me().getTable(this.modelClass)获取table,但是如果全局拦截器有调用到继承这个Service的方法就会报为空,想问问TableMapping里面的modelToTableMap是什么时候加载进去的

JFinal

2019-08-09 09:07

@lzw0128 是在 activeRecordPlugin.start() 时加载进去的,你可以在 configPlugin 中去掉
me.add(activeRecordPlugin)

然后添加一行:
activeRecordPlugin.start();

相当于是自己手动 start() ,在文档中有过说明:
https://www.jfinal.com/doc/5-15

lzw0128

2019-08-09 10:52

@JFinal 好的,我看看!十分感谢!!!