我一直在試圖用spring實現一個web服務。這個web服務將使用JDBC提供對mySQL數據庫的數據訪問。我試圖不使用任何XML配置文件,所以我遇到了嘗試連接到數據庫的問題。Spring jdbc配置
我按照教程:http://spring.io/guides/tutorials/rest/,但我一直在改變一些事情。
現在,我正試圖實現與數據庫的連接,當嘗試執行tomcat實例時出現錯誤,我猜這個問題在配置中。
這裏如下一些我的代碼:
數據源配置:
@Configuration
@Profile("mySQL")
@PropertySource("classpath:/services.properties")
public class MySQLDataSourceConfiguration implements DataSourceConfiguration{
@Inject
private Environment environment;
@Bean
public DataSource dataSource() throws Exception {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setPassword(environment.getProperty("dataSource.password"));
dataSource.setUrl(environment.getProperty("dataSource.url"));
dataSource.setUsername(environment.getProperty("dataSource.user"));
dataSource.setDriverClassName(environment.getPropertyAsClass("dataSource.driverClass", Driver.class).getName());
return dataSource;
}
}
文件service.properties就是我把我的配置數據庫,所以當我渴望更改數據庫我會只需要改變4個領域。
爲JdbcTemplate的
@Configuration
@EnableTransactionManagement
@PropertySource("classpath:/services.properties")
@Import({ MySQLDataSourceConfiguration.class })
public class JdbcConfiguration {
@Autowired
private DataSourceConfiguration dataSourceConfiguration;
@Inject
private Environment environment;
@Bean
public JdbcTemplate setupJdbcTemplate() throws Exception {
return new JdbcTemplate(dataSourceConfiguration.dataSource());
}
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource) throws Exception {
return new DataSourceTransactionManager(dataSource);
}
}
設置的JDBCConfiguration類再有就是資源庫,是臨危模板。
private WebApplicationContext createRootContext(ServletContext servletContext) {
AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
rootContext.register(CoreConfig.class, SecurityConfig.class, JdbcConfiguration.class);
rootContext.refresh();
servletContext.addListener(new ContextLoaderListener(rootContext));
servletContext.setInitParameter("defaultHtmlEscape", "true");
return rootContext;
}
然而,Tomcat服務器不會運行,因爲它不能自動裝配類:
@Transactional
@Repository
@Qualifier("jdbcRepository")
public class JdbcIndividualRepository implements IndividualsRepository{
private static final Logger LOG = LoggerFactory.getLogger(JdbcIndividualRepository.class);
@Autowired
private JdbcTemplate jdbcTemplate;
@Autowired
public JdbcIndividualRepository(DataSource jdbcDataSource) {
LOG.info("JDBCRepo arg constructor");
this.jdbcTemplate = new JdbcTemplate(jdbcDataSource);
}
@Override
public Individual save(Individual save) {
String sql = "INSERT INTO Individual(idIndividual, Name) VALUES(?,?)";
this.jdbcTemplate.update(sql, save.getId(), save.getName());
return save;
}
@Override
public void delete(String key) {
String sql = "DELETE FROM Individual WHERE idIndividual=?";
jdbcTemplate.update(sql, key);
}
@Override
public Individual findById(String key) {
String sql = "SELECT i.* FROM Individual i WHERE i.idIndividual=?";
return this.jdbcTemplate.queryForObject(sql, new IndividualRowMapper(), key);
}
@Override
public List<Individual> findAll() {
String sql = "SELECT * FROM Individual";
return new LinkedList<Individual>(this.jdbcTemplate.query(sql, new IndividualRowMapper()));
}
}
然後我創建應用程序的根上下文時如下寄存器中初始化類的JDBC配置MySQLDataSourceConfiguration。
任何人都知道問題可能是什麼?我可以提供關於代碼的更多細節,但問題已經非常大。
感謝任何幫助! 乾杯
編輯
解決改變JdbcConfiguration類:
@Configuration
@EnableTransactionManagement
@PropertySource("classpath:/services.properties")
@Import({ MySQLDataSourceConfiguration.class })
public class JdbcConfiguration {
@Autowired
private DataSource dataSource;
@Inject
private Environment environment;
@Bean
public JdbcTemplate setupJdbcTemplate() throws Exception {
return new JdbcTemplate(dataSource);
}
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource) throws Exception {
return new DataSourceTransactionManager(dataSource);
}
@Bean
public IndividualsRepository createRepo(){
return new JdbcIndividualRepository(dataSource);
}
}
可能是你的'JdbcConfiguration'類的層次低於'MySQLDataSourceConfiguration'類。嘗試將'JdbcConfiguration'類放置在比MySQLDataSourceConfiguration更高的層次結構中,或者在JdbcConfiguration類中複製'@Bean public DataSource dataSource()'方法。 – Shams
我不喜歡你的進口。我只是在context.register上調用它。但可能你真正的問題是你用@Profile(「mySQL」)標記了MySQLDataSourceConfiguration。嘗試添加到您的上下文:rootContext.getEnvironment()。setActiveProfiles(「mySQL」); – Terry
你也可以發佈堆棧跟蹤(完整的一個)嗎?如果您擔心帖子的大小,請使用[pastebin.com](http://pastebin.com) –