How to autowire DataSource in JdbcDaoSupport

A Simple DAO class extends JdbcDaoSupport, but, unable to inject or @autowired a “dataSource”, the method setDataSource is final, can’t override.

UserDetailsDaoImpl.java

package com.mkyong.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

To quickly fix it, uses @PostConstruct to inject the dataSource like this :

UserDetailsDaoImpl.java

package com.mkyong.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);
	}
	
}

Alternatively, create an own implementation of JdbcDaoSupport class, and do whatever you want. Dive inside the source code of JdbcDaoSupport, it’s just a simple helper class to create a jdbcTemplate.

Note
There is a jira report on Spring io, request to remove final modifiers, but the resolution is “won’t fix”.

5 comments on “How to autowire DataSource in JdbcDaoSupport

  1. what to do if we have multiple dao and dao implementations? how to do datasource configuration in java. can u share that example please. awaiting for your valuable reply

Leave a Comment

Your email address will not be published. Required fields are marked *