Spring AspectJ 在双代理接口时失败:无法生成类的 CGLIB 子类



我正在使用 Spring 的<aop:aspectj-autoproxy />来代理一些 JPA 存储库接口。

但是,代理失败,出现以下Cannot subclass final class class $Proxy80

无法生成类 [类 $Proxy 80] 的 CGLIB 子类:通用 此问题的原因包括使用最终类或不可见的 .class;嵌套异常是java.lang.IllegalArgumentException:不能 子类 最终班级 $Proxy 80

正如错误和快速谷歌所表明的那样 - 当代理目标是最终类时,就会发生这种情况。 但是,在这个链中,没有类 - 只有接口。 Spring 在运行时生成所有实现。

以下是失败的接口的定义:

public interface AuthorDAO extends
    CrossStoreJpaRepository<Author,Long>, CrossStoreQueryDslPredicateExecutor<Author> {
}

注意我正在使用 spring 的 JpaRepository 和 QueryDslPredicateExecutor 的自定义子类,定义如下:

public interface CrossStoreJpaRepository<T, ID extends Serializable> extends JpaRepository<T, ID> {}
public interface CrossStoreQueryDslPredicateExecutor<T> extends QueryDslPredicateExecutor<T>{}

在其他地方,我为这些接口上的方法定义自定义方面:

@Aspect
@Component
public class DocumentLoadingAspect extends AbstractDocumentAspect {
    @Around("execution(* com.mangofactory.crossstore.repository.CrossStore*.find*(..))")
    public Object loadCrossStoreEntity(ProceedingJoinPoint pjp) throws Throwable
    {
         // implementation omitted
    }

我已经确认正是这些@Aspect定义通过删除它们并重新运行应用程序来导致问题。

导致此错误的原因是什么? 似乎由于某种原因代理代理失败。

我的猜测是 Spring data JPA 将存储库实现创建为 Java 代理,这是最终的,然后<aop:aspectj-autoproxy />尝试使用 cglib 子类创建另一个代理,这是行不通的。proxy-target-class是否设置为在自动代理元素上true

最新更新