我一直在尝试使用spring实现Web服务。此Web服务将使用JDBC提供对mySQL数据库的数据访问。我试图不使用任何xml配置文件,所以我遇到了尝试连接数据库的问题。
我正在关注教程: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的JDBCConfiguration类
@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);
}
}
然后是Repository,它接收模板。
@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配置,如下所示:
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服务器不会运行,因为它无法自动装配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 :(得分:1)
删除
@Autowired
private DataSourceConfiguration dataSourceConfiguration;
因为它不是应该如何使用的。而是将以下内容添加到同一个类中:
@Autowired DataSource dataSource;
并像这样使用它:new JdbcTemplate(dataSource);
另外,尝试将@ComponentScan添加到JdbcConfiguration类。从我在你的代码中看到的,JdbcIndividualRepository类没有被任何东西选中。
答案 1 :(得分: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
并且你正在使用Spring配置文件来分隔它们,那么在一个文件中提供所有DataSource
bean并使用不同的配置文件注释每个bean会更容易:< / p>
@Configuration
public class DataSourceConfig {
@Bean
@Profile("Test")
public DataSource devDataSource() {
.... configure data source
}
@Bean
@Profile("Prod")
public DataSource prodDataSource() {
... configure data source
}