la inyección de bienes derivados de haba @Repository sin @Autowired en superclase

StackOverflow https://stackoverflow.com/questions/3807707

  •  25-09-2019
  •  | 
  •  

Pregunta

Me gustaría utilizar la anotación de la primavera @Repository para evitar la adición de frijol en context.xml. Yo uso ibatis integración, por lo que mi aspecto de clase repositorio como este

@Repository("userDao")
public class UserDaoMybatis extends SqlMapClientDaoSupport implements UserDao {
    // ...
}

SqlMapClientDaoSupport (clase biblioteca primavera) tiene método final para el establecimiento de la propiedad requerida que no está anotado con @Autowired o @Resourse

public final void setSqlMapClient(SqlMapClient sqlMapClient) {
    if (!this.externalTemplate) {
        this.sqlMapClientTemplate.setSqlMapClient(sqlMapClient);
    }
}
bean

SqlMapClient se define en context.xml primavera. Si frijol UserDAO se define en XML que trabaja muy bien, pero cuando pongo anotación y frijol quitar @Repository declaración me da la siguiente excepción

java.lang.IllegalArgumentException: Property 'sqlMapClient' is required

Una solución puede consistir en añadir nuevo método como

@Aitowired
injectSqlMapClient(SqlMapClient sqlMapClient) {
    setSqlMapClient(sqlMapClient);
}

pero se ve feo

¿Hay alguna otra manera yo inyecte la propiedad sin haber definido?

¿Fue útil?

Solución

¿Qué hay de la introducción de una superclase intermediario?

public class AutowiringSqlMapClientDaoSupport extends SqlMapClientDaoSupport {

   @Autowired
   injectSqlMapClient(SqlMapClient sqlMapClient) {
      setSqlMapClient(sqlMapClient);
   }
}

y

@Repository("userDao")
public class UserDaoMybatis extends AutoringSqlMapClientDaoSupport implements UserDao {
    // ...
}

Sí, es el abuso de la herencia, pero no es peor que la SqlMapClientDaoSupport existente, y si usted está desesperado por evitar el gancho de inyección en la propia clase DAO, no puedo pensar en una mejor manera.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top