8

Spring を使用して、いくつかのJPA リポジトリインターフェイス<aop:aspectj-autoproxy />をプロキシしています。

ただし、プロキシは次のように失敗していますCannot subclass final class class $Proxy80

クラス [クラス $Proxy80] の CGLIB サブクラスを生成できませんでした: この問題の一般的な原因には、最終クラスまたは非表示クラスの使用が含まれます。ネストされた例外は java.lang.IllegalArgumentException: 最終クラス クラス $Proxy80 をサブクラス化できません

エラーと簡単なグーグルが示唆するように、これはプロキシターゲットが最終クラスの場合に発生します。ただし、このチェーンにはクラスはなく、インターフェイスのみです。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これらの定義を削除してアプリを再実行することで、これらの定義が問題の原因であることを確認しました。

このエラーの原因は何ですか? プロキシのプロキシ化が何らかの理由で失敗しているようです。

4

1 に答える 1

0

私の推測では、Spring データ JPA はレポ実装を最終的なJavaプロキシとして作成し、 <aop:aspectj-autoproxy />cglib サブクラス化を使用してアスペクトごとに別のプロキシを作成しようとしますが、これは機能しません。autoproxy 要素にproxy-target-class設定されていますか?true

于 2013-05-25T20:07:26.517 に答える