Spring AOP 无法拦截Controller层方法的问题
定义了一个切面,打算拦截污染源的CompanyController以便于监听企业信息更新操作,结果直接报错:
Could not generate CGLIB subclass of class [class com.lztravel.dao.SceneryDao]: Common causes of this problem include using a final class or a non-visible class; nested exception is org.springframework.cglib.core.CodeGenerationException: java.lang.ClassCastException-->java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
网上找了一些解决办法,都是基于CGLIB代理来找问题的,后来关注到ClassCastException这个,发现CompanyController是继承自一个泛型AbstractBaseController<T> 。
因为代理类CompanyController的构造函数默认是继承自是AbstractBaseController,而AbstractBaseController是一个泛型类型(ParameterizedType),并且AbstractBaseController的构造函数里面
entityClass = (Class<T>) ((ParameterizedType) getClass()
.getGenericSuperclass()).getActualTypeArguments()[0];
将其改为:
if (getClass().getGenericSuperclass() instanceof ParameterizedType) {
entityClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass())
.getActualTypeArguments()[0];
} else {
entityClass = (Class<T>) ((ParameterizedType) getClass().getSuperclass().getGenericSuperclass())
.getActualTypeArguments()[0];
}
问题解决