2012-10-02 7 views
11

All'avvio dell'applicazione, ricevo numerosi avvisi lungo le linee o.s.aop.framework.Cglib2AopProxy 'Unable to proxy method [public final void org.springframework.jdbc.core.support.JdbcDaoSupport.setDataSource(javax.sql.DataSource)] because it is final: All calls to this method via a proxy will be routed directly to the proxy.' per circa una dozzina di funzioni.L'applicazione Spring ha avvertimenti Cglib2AopProxy

Ora capisco perfettamente che gli aspetti basati su proxy non possono essere applicati ai metodi finali. Tuttavia, non ho (almeno intenzionalmente) cercato di intrecciare alcun aspetto in JdbcDaoSupport. Sospetto che provenga da <tx:annotation-driven />. C'è qualcosa che posso fare per mettere a tacere questi avvertimenti o, meglio ancora, escludere quelle classi dall'aspetto dell'intreccio?

risposta

2

Forse avete esteso JdbcDaoSupport e aggiunto @Transactional annotazioni.

È possibile impostare il logger Cglib2AopProxy su ERRORE livello di registro per evitare i messaggi di avviso. Per esempio se si utilizza log4j e log4j.properties:

log.logger.org.springframework.aop.framework.Cglib2AopProxy = ERROR 
+4

Il silenziamento in questo modo è un po 'troppo aspecifico. L'avvertimento in sé può essere abbastanza utile. –

13

Questo è probabilmente causato dal @Transactional annotazione, molla avvolge il tuo DAO in un proxy per aggiungere il comportamento transazionale.

mi sento di raccomandare per rendere il vostro DAO implementare un'interfaccia (creare e utilizzare un'interfaccia per il vostro DAO), questo permetterà di primavera per utilizzare un proxy dinamica JDK invece di dover utilizzare CGLIB.

Utilizzando CGLIB ha una limitazione che i metodi contrassegnati come finale nella classe di destinazione non può essere consigliato come metodi finali non possono essere ridefinite (CGLIB crea una sottoclasse di classe di destinazione in fase di esecuzione), ma questa limitazione scompare in caso di usando i proxy dinamici JDK.

Reference

+2

Sono abbastanza consapevole del problema del proxy, come indicato nella domanda. Tuttavia, non uso 'JdbcDaoSupport' ovunque. Tutti i miei repository (tranne uno) usano Spring Data e quindi devono essere interfacce comunque. Devo verificare se il rimanente è il colpevole o Spring Data stessa o forse l'implementazione personalizzata che estende uno di essi. –

1

Si dovrebbe usare le interfacce per l'iniezione di dipendenza, la maggior parte dei motivi di questo sono descritte here e here.

È possibile leggere documentation about proxying mechanic per i dettagli sul motivo per cui viene visualizzato questo avviso.

E si prega di votare per feature request of inspection for IntelliJ che potrebbe aiutarci a evitare questi avvertimenti. BTW contiene anche una buona spiegazione.

+2

Non sono d'accordo con "Dovresti usare le interfacce per l'iniezione delle dipendenze", e i riferimenti citati sono del 2012. –