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
これらの定義を削除してアプリを再実行することで、これらの定義が問題の原因であることを確認しました。
このエラーの原因は何ですか? プロキシのプロキシ化が何らかの理由で失敗しているようです。