2017-04-17 241 views
11

我想自动装配数据库的多个豆我在我的application.yml无法自动装配。这里是</p> <pre><code>@Autowired private DataSource dataSource; </code></pre> <p>“数据源”型

spring: 
    profiles: 
    active: dev 

--- 
spring: 
    profiles: dev 
    datasource: 
    driverClassName: org.mariadb.jdbc.Driver 
    url: jdbc:mariadb://localhost:3306/dbname 
    username: user 
    password: password 

name: dev 

logging: 
    level: 
    org.springframework: INFO 


--- 

spring: 
    profiles: prod 
name: prod 

logging: 
    level: 
    org.springframework: INFO 

一个数据源,但我得到一个错误信息说。

Could not autowire. There is more than one bean of 'DataSource' type. 

Beans:dataSource (DataSourceConfiguration.class) 
     dataSource (DataSourceConfiguration.class) 

enter image description here

,我觉得奇怪,因为我只有在我的application.yml定义一个数据源,据我所知,我没有任何其他的数据源定义。

我给了一个配置尝试,但我仍然得到同样的问题。

@Configuration 
@EnableConfigurationProperties 
public class AppConfig { 

    @Bean 
    @ConfigurationProperties(prefix="spring.datasource") 
    public DataSource dataSource() { 
     return DataSourceBuilder.create().build(); 
    } 
} 

这是我的 '聚甲醛' 文件

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>id.group</groupId> 
    <artifactId>ProjectName</artifactId> 
    <version>1.0-SNAPSHOT</version> 

    <properties> 
     <java.version>1.8</java.version> 
    </properties> 

    <parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.5.2.RELEASE</version> 
    </parent> 


    <dependencies> 
     <!--Spring Boot dependencies--> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-web</artifactId> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-test</artifactId> 
      <scope>test</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-devtools</artifactId> 
      <optional>true</optional> 
     </dependency> 
     <!--Spring Boot dependencies--> 
     <!--Spring Security dependencies--> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-security</artifactId> 
     </dependency> 
     <!--Spring Security dependencies--> 
     <!--JWT dependencies--> 
     <dependency> 
      <groupId>io.jsonwebtoken</groupId> 
      <artifactId>jjwt</artifactId> 
      <version>0.7.0</version> 
     </dependency> 
     <!--JWT dependencies--> 
     <!--Actuator and HAL browser dependencies--> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-actuator</artifactId> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework.data</groupId> 
      <artifactId>spring-data-rest-hal-browser</artifactId> 
     </dependency> 
     <!--Actuator and HAL browser dependencies--> 
     <!--Database dependencies--> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-jdbc</artifactId> 
     </dependency> 

     <dependency> 
      <groupId>org.mariadb.jdbc</groupId> 
      <artifactId>mariadb-java-client</artifactId> 
      <version>1.5.7</version> 
     </dependency> 
     <!--Database dependencies--> 

    </dependencies> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-maven-plugin</artifactId> 
      </plugin> 
     </plugins> 
    </build> 

</project> 

我使用Spring 1.5.2引导和IntelliJ 2017.1

+0

是否有任何创建数据源的Spring配置类或文件? – reos

+0

@reos否数据源只在'application.yml'文件中。 – g3blv

+0

嗯,这很奇怪,你可以添加配置类吗? – reos

回答

7

试试这个,它的工作对我来说,使用@Primary这样

@Primary 
    @Bean(name ="prodDataSource") 
    @ConfigurationProperties(prefix="spring.datasource") 
    public DataSource dataSource() { 
     return DataSourceBuilder.create().build(); 
    } 

    @Bean(name = "prodJdbc") 
    public JdbcTemplate prodJdbcTemplate(@Qualifier("prodDataSource") DataSource prodDataSource){ 
     return new JdbcTemplate(prodJdbcTemplate); 
    } 

    @Bean(name = "devDataSource") 
    @ConfigurationProperties(prefix = "spring.datasource.dev") 
    public DataSource devDataSource() { 
     return DataSourceBuilder.create().build(); 
    } 

    @Bean(name = "devJdbc") 
    public JdbcTemplate devJdbcTemplate(@Qualifier("devDataSource") DataSource devDataSource) { 
     return new JdbcTemplate(devDataSource); 
    } 

然后用@autowire这样

@Autowired 
@Qualifier("prodJdbc") 
private JdbcTemplate prodJdbcTemplate; 

我希望这可以帮助你或他人:)

+0

工作。感谢分享。 – g3blv

4

请注意,春天开机自动配置豆不支持100%还,请参阅https://youtrack.jetbrains.com/issue/IDEA-139669了解进度和可能的工作量。

+0

我试过“启用,使用帮助 - >编辑自定义属性,添加与idea.spring.boot.filter.autoconfig = false新行并重新启动IDE”,但我仍然有错误。我可以看到同一个bean两次。我为原始问题添加了屏幕截图。有没有其他的解决方法,或者我应该手动创建一个Bean并使用Primary? – g3blv

2

我通过在属性上添加限定符解决:

@Autowired 
@Qualifier("dataSource") 
private DataSource dataSource; 
相关问题