proxy 动态代理泛型问题

问题:在jfinal4.6版本以后使用了自己的proxy后aop.get(class)会报泛型问题

符号:   类 T
  位置: 类 com.jiubanqingchen.wish.org.business.user.UserService$$EnhancerByJFinal
2020-09-28 17:11:51 [ERROR] (ProxyCompiler.java:155):lambda$outputCompileError$0():/UserService$$EnhancerByJFinal.java:38: 错误: 找不到符号
	public  T update(T p0, com.jfinal.plugin.activerecord.Record p1, com.jiubanqingchen.wish.model.models.User p2) throws java.lang.Exception {
	        ^
  符号:   类 T
  位置: 类 com.jiubanqingchen.wish.org.business.user.UserService$$EnhancerByJFinal
2020-09-28 17:11:51 [ERROR] (ProxyCompiler.java:155):lambda$outputCompileError$0():/UserService$$EnhancerByJFinal.java:72: 错误: 找不到符号
	public  boolean delete(T p0, com.jfinal.plugin.activerecord.Record p1, com.jiubanqingchen.wish.model.models.User p2) throws java.lang.Exception {

代码如下:

public class ModelController<T extends ModelService, M extends Model> extends BaseController implements IModelController {
    private static Logger logger = LoggerFactory.getLogger(ModelController.class);

    protected T service;

    private Class<M> modelClazz;

    public ModelController() {
        service = Aop.get(((Class<T>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0]));
    }
    ......
}

如上代码直接使用是没问题的;出现问题是因为我加了一个全局service拦截器;不加全局service拦截器程序是可以正常运行的

me.addGlobalServiceInterceptor(new MessageAop());

我看了下文档 使用了cglib代理方式,这样是可以用aop.get()没有问题;全局service拦截器也能正常使用

me.setToCglibProxyFactory();  // 4.6 版本新增配置方式

想请教下我这个问题是什么原因呢

评论区

JFinal

2020-09-28 22:17

jfinal 默认的 aop 是通过生成 java 源码动态编译它来实现的。类上面使用泛型的某些用法无法识别出来,如果在被代理的方法上使用了无法识别的泛型就会有问题。

使用 me.setToCglibProxyFactory(); 是通过 cglib 直接改写字节码来实现 aop 的,可以解决这个问题

一般情况没事

久伴轻尘

2020-09-29 08:51

@JFinal 好的谢谢,那我以后使用cglib 的方式,这样目前来说没问题

热门反馈

扫码入社