Comment autowire DataSource dans JdbcDaoSupport
Une classe DAO simple étendJdbcDaoSupport
, mais, incapable d'injecter ou de @autowired une «source de données», la méthodesetDataSource
est finale, ne peut pas être remplacée.
UserDetailsDaoImpl.java
package com.example.users.dao; import javax.sql.DataSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.support.JdbcDaoSupport; import org.springframework.stereotype.Repository; @Repository public class UserDetailsDaoImpl extends JdbcDaoSupport implements UserDetailsDao { //Error, cannot override the final method from JdbcDaoSupport @Autowired public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; } }
Solution
Pour le corriger rapidement, utilise@PostConstruct
pour injecter lesdataSource
comme ceci:
UserDetailsDaoImpl.java
package com.example.users.dao; import javax.sql.DataSource; import javax.annotation.PostConstruct; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.support.JdbcDaoSupport; import org.springframework.stereotype.Repository; @Repository public class UserDetailsDaoImpl extends JdbcDaoSupport implements UserDetailsDao { @Autowired private DataSource dataSource; @PostConstruct private void initialize() { setDataSource(dataSource); } }
Vous pouvez également créer une propre implémentation de la classeJdbcDaoSupport
et faire ce que vous voulez. Plongez dans le code source deJdbcDaoSupport
, c'est juste une simple classe d'aide pour créer unjdbcTemplate
.
Note
Il y a unejira report sur Spring io, demande de suppression des modificateurs finaux, mais la résolution est «ne sera pas corrigée».