2014-06-24 99 views
0

我一直在試圖用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); 
    } 
} 
+0

可能是你的'JdbcConfiguration'類的層次低於'MySQLDataSourceConfiguration'類。嘗試將'JdbcConfiguration'類放置在比MySQLDataSourceConfiguration更高的層次結構中,或者在JdbcConfiguration類中複製'@Bean public DataSource dataSource()'方法。 – Shams

+0

我不喜歡你的進口。我只是在context.register上調用它。但可能你真正的問題是你用@Profile(「mySQL」)標記了MySQLDataSourceConfiguration。嘗試添加到您的上下文:rootContext.getEnvironment()。setActiveProfiles(「mySQL」); – Terry

+0

你也可以發佈堆棧跟蹤(完整的一個)嗎?如果您擔心帖子的大小,請使用[pastebin.com](http://pastebin.com) –

回答

1

刪除

@Autowired 
private DataSourceConfiguration dataSourceConfiguration; 

因爲這不是它應該如何使用。相反,添加到同一類中的以下內容:

@Autowired DataSource dataSource; 

,並使用它是這樣的:new JdbcTemplate(dataSource);

同時,儘量增加@ComponentScan到JdbcConfiguration類。從我在代碼中看到的JdbcIndividualRepository類沒有被任何東西拾取。

+0

最重要的是,我還缺少一個包含存儲庫的Bean。感謝您的幫助! – Noronha

+0

很高興能有所幫助。 –

0

在你JdbcConfiguration類,你想自動裝配DataSourceConfiguration。我不太確定這是否可能 - 通常您應該嘗試聯繫DataSource,而不是DataSourceConfiguration

@Import({ MySQLDataSourceConfiguration.class }) 
public class JdbcConfiguration { 

    @Autowired 
    private DataSource dataSource; 

    @Bean 
    public JdbcTemplate setupJdbcTemplate() throws Exception { 
     return new JdbcTemplate(dataSource); 
    } 

此外,如果你有幾個DataSource S和你使用Spring配置文件將它們分開,很容易提供的所有DataSource豆在一個文件中,並用不同的配置文件註釋每個bean:

@Configuration 
public class DataSourceConfig { 

    @Bean 
    @Profile("Test") 
    public DataSource devDataSource() { 
     .... configure data source 
    } 

    @Bean 
    @Profile("Prod") 
    public DataSource prodDataSource() { 
     ... configure data source 
    } 
+0

是的,我想使用配置文件,因爲我最終會有幾個數據源,但我現在可以刪除它們。 但是,導入配置類和AAutowiring DataSource並不能解決問題。感謝您的答覆! – Noronha