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».