春天AspectJ的失败时,双代理接口:无法生成类的子类CGLIB(Spring AspectJ f

2019-07-29 04:42发布

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

然而,代理与下列故障Cannot subclass final class class $Proxy80

无法生成类[类$ Proxy80]的CGLIB子类:这个问题的常见原因包括使用final类或不可见的类; 嵌套的例外是java.lang.IllegalArgumentException异常:不能继承final类类$ Proxy80

由于错误,并快速谷歌,提示 - 当代理的目标是一个final类发生这种情况。 然而,在这条产业链,有没有课 - 只有接口。 春天在运行时产生所有的实现。

这里是一个的失败的接口的定义:

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由取出并重新运行该应用程序导致该问题的定义。

是什么原因造成这个错误? 这似乎是一个进行代理代理是失败的一些原因。

Answer 1:

我的猜测是,春数据JPA创建回购执行情况这是最后再将Java代理<aop:aspectj-autoproxy />尝试创建您的每一个方面的另一个代理使用CGLIB子类,这将无法正常工作。 被proxy-target-class设置为true自动代理元素?



文章来源: Spring AspectJ fails when double-proxying interface: Could not generate CGLIB subclass of class