8

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

但是,代理失败并显示以下内容Cannot subclass final class class $Proxy80

无法生成类 [class $Proxy80] 的 CGLIB 子类:此问题的常见原因包括使用最终类或不可见类;嵌套异常是 java.lang.IllegalArgumentException: Cannot subclass final class class $Proxy80

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

这是失败的接口的定义:

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

}

注意我使用的是 spring 的JpaRepositoryQueryDslPredicateExecutor的自定义子类,定义如下:

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我已经通过删除它们并重新运行应用程序来确认是这些定义导致了问题。

是什么导致了这个错误?由于某种原因,代理代理似乎失败了。

4

1 回答 1

0

我的猜测是 Spring data JPA 将 repo 实现创建为最终的 Java 代理,然后<aop:aspectj-autoproxy />尝试使用不起作用的 cglib 子类化根据您的方面创建另一个代理。是否proxy-target-class设置为trueautoproxy 元素?

于 2013-05-25T20:07:26.517 回答