【问题标题】:Spring AspectJ fails when double-proxying interface: Could not generate CGLIB subclass of class双重代理接口时Spring AspectJ失败:无法生成类的CGLIB子类
【发布时间】:2012-05-09 19:11:38
【问题描述】:

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

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

无法生成类 [class $Proxy80] 的 CGLIB 子类:Common 此问题的原因包括使用最终类或不可见的 班级;嵌套异常是 java.lang.IllegalArgumentException: 不能 子类 final 类 $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 定义导致了问题,方法是删除它们并重新运行应用程序。

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

【问题讨论】:

  • 您找到解决方案了吗?我在集成网关界面上遇到了同样的错误。

标签: java spring aspectj


【解决方案1】:

我的猜测是 Spring data JPA 将 repo 实现创建为 final 的 Java 代理,然后 &lt;aop:aspectj-autoproxy /&gt; 尝试使用 cglib 子类化创建另一个代理,这不起作用.自动代理元素上的proxy-target-class 是否设置为true

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多