2012-04-30 9 views
8

Sto utilizzando Spring <aop:aspectj-autoproxy /> per il proxy di alcune interfacce JPA repository.Spring AspectJ non riesce quando interfaccia con doppio proxy: Impossibile generare sottoclasse CGLIB della classe

Tuttavia, il proxy non riesce con il seguente Cannot subclass final class class $Proxy80:

Impossibile generare CGLIB sottoclasse di [classe $ Proxy80]: comuni cause di questo problema includono l'utilizzo di una classe finale o un non-visibile classe; l'eccezione annidata è java.lang.IllegalArgumentException: Impossibile sottoclasse classe classe finale $ Proxy80

Come l'errore, e un rapido google, suggerisce - ciò si verifica quando il bersaglio proxy è un classe finale. Tuttavia, in questa catena, non ci sono classi - solo interfacce. Spring genera tutte le implementazioni in fase di runtime.

Ecco la definizione dell'interfaccia che è mancata:

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

} 

Nota Sto utilizzando una sottoclasse personalizzata della primavera del JpaRepository e QueryDslPredicateExecutor, definito come segue:

public interface CrossStoreJpaRepository<T, ID extends Serializable> extends JpaRepository<T, ID> {} 
public interface CrossStoreQueryDslPredicateExecutor<T> extends QueryDslPredicateExecutor<T>{} 

Altrove, definisco personalizzato aspetti per i metodi su queste interfacce:

@Aspect 
@Component 
public class DocumentLoadingAspect extends AbstractDocumentAspect { 

    @Around("execution(* com.mangofactory.crossstore.repository.CrossStore*.find*(..))") 
    public Object loadCrossStoreEntity(ProceedingJoinPoint pjp) throws Throwable 
    { 
     // implementation omitted 
    } 

Ho confermato che sono queste le definizioni @Aspect che causano il problema rimuovendole e rieseguendo l'app.

Che cosa sta causando questo errore? Sembra che il proxy di un proxy stia fallendo per qualche motivo.

+0

Hai trovato la soluzione per questo? Ricevo lo stesso errore quando sull'interfaccia di Integration Gateway. – Ocelot

risposta

0

La mia ipotesi è che i dati di primavera JPA crea l'attuazione di pronti contro termine come un proxy Java che è finale e poi <aop:aspectj-autoproxy /> tentativi di di creare un altro proxy per il tuo aspetto utilizzando sottoclasse cglib che non funziona. proxy-target-class è impostato su true sull'elemento autoproxy?

Problemi correlati