Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Multiple DataSource and JdbcTemplate in Spring Boot (> 1.1.0)

I would like to inject a specific JdbcTemplatein a Spring Boot project. I tried to follow this example for multiple DataSourceconfiguration : http://spring.io/blog/2014/05/27/spring-boot-1-1-0-m2-available-now

My code does compile and run, but only the DataSource with the @Primaryannotation is taken into account, no matter what I put as @Qualifier in the SqlServiceclass. My relevant code is the following :

DatabaseConfig.java:

@Configuration public class DatabaseConfig {      @Bean(name = "dsSlave")     @ConfigurationProperties(prefix="spring.mysql_slave")     public DataSource slaveDataSource() {         return DataSourceBuilder.create().build();     }      @Bean(name = "dsMaster")     @Primary     @ConfigurationProperties(prefix="spring.mysql_master")     public DataSource masterDataSource() {         return DataSourceBuilder.create().build();     }      @Bean(name = "jdbcSlave")     @Autowired     @Qualifier("dsSlave")     public JdbcTemplate slaveJdbcTemplate(DataSource dsSlave) {         return new JdbcTemplate(dsSlave);     }      @Bean(name = "jdbcMaster")     @Autowired     @Qualifier("dsMaster")     public JdbcTemplate masterJdbcTemplate(DataSource dsMaster) {         return new JdbcTemplate(dsMaster);     }  } 

And I did a quick service to try it out :

SqlService.java:

@Component public class SqlService {      @Autowired     @Qualifier("jdbcSlave")     private JdbcTemplate jdbcTemplate;      public String getHelloMessage() {         String host = jdbcTemplate.queryForObject("select @@hostname;", String.class);         System.out.println(host);         return "Hello";     }  } 
like image 595
Xavier Avatar asked Jul 15 '14 10:07

Xavier


2 Answers

It should looks like this:

@Bean(name = "jdbcSlave") @Autowired public JdbcTemplate slaveJdbcTemplate(@Qualifier("dsSlave") DataSource dsSlave) {     return new JdbcTemplate(dsSlave); } 
like image 123
KirkoR Avatar answered Sep 25 '22 21:09

KirkoR


Try to move @Qualifier annotation to the parameter on your @Bean methods for JdbcTemplate.

I guess, when you remove @Primary you end up with error, where more than one appropriate beans are presented

like image 35
Artem Bilan Avatar answered Sep 24 '22 21:09

Artem Bilan