2012-10-02 10 views
11

Al iniciar mi aplicación, recibo numerosas advertencias a lo largo de las líneas de 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.' para aproximadamente una docena de funciones.La aplicación Spring tiene advertencias Cglib2AopProxy

Ahora entiendo perfectamente que los aspectos basados ​​en proxy no se pueden aplicar a los métodos finales. Sin embargo, no (a propósito, al menos) intenté tejer ningún aspecto en JdbcDaoSupport. Sospecho que proviene de <tx:annotation-driven />. ¿Hay algo que pueda hacer para silenciar estas advertencias o, mejor aún, excluir esas clases del tejido de aspectos?

Respuesta

2

Tal vez ha extendido JdbcDaoSupport y ha agregado @Transactional anotaciones.

Puede configurar el registrador Cglib2AopProxy en el nivel de registro ERROR para evitar los mensajes de advertencia. Por ejemplo si se utiliza log4j y log4j.properties:

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

Silenciarlo de esta manera es demasiado inespecífico. La advertencia en sí misma puede ser bastante útil. –

13

Esto es muy probablemente causado por el @Transactional anotación, primavera envuelve su DAO en un proxy para añadir el comportamiento transaccional.

Recomendaría hacer que su DAO implemente una interfaz (cree y use una interfaz para su DAO), esto permitirá que Spring utilice un proxy dinámico JDK en lugar de tener que usar CGLib.

Usando CGLIB tiene una limitación que los métodos marcados como final en la clase de destino no puede ser aconsejado como métodos finales no se pueden anular (CGLIB crea una subclase de la clase de destino en tiempo de ejecución), pero esta limitación desaparece en caso de usando proxies dinámicos JDK.

Reference

+2

Soy bastante consciente del problema de proxy, como se indica en la pregunta. Sin embargo, no uso 'JdbcDaoSupport' en ninguna parte. Todos mis repositorios (excepto uno) usan Spring Data y, por lo tanto, deben ser interfaces de todos modos. Tengo que investigar si el otro es el culpable o Spring Data en sí o quizás la implementación personalizada que amplía uno de ellos. –

1

Debe utilizar las interfaces para la inyección de dependencias, la mayoría de las razones para esto se describen here y here.

Puede leer documentation about proxying mechanic para obtener más información sobre por qué aparece esta advertencia.

Y vote por feature request of inspection for IntelliJ que puede ayudarnos a evitar estas advertencias. Por cierto, también contiene una buena explicación.

+2

No estoy de acuerdo con "Debe usar interfaces para la inyección de dependencias", y las referencias que cita son de 2012. –

Cuestiones relacionadas