2017-04-17 31 views
11

Próbuję Autowire bazy danych przezNie można autowirować. Jest więcej niż jeden fasola z „DataSource” typu

@Autowired 
private DataSource dataSource; 

Mam jedno źródło danych w moim application.yml

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 

Ale pojawia się komunikat o błędzie .

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

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

enter image description here

co uważam dziwne, ponieważ mam jedno źródło danych zdefiniowane tylko w moim application.yml i do mojej wiedzy nie mam jakiekolwiek inne źródło danych zdefiniowane.

Próbowałem z konfiguracją, ale nadal mam ten sam problem.

@Configuration 
@EnableConfigurationProperties 
public class AppConfig { 

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

To jest mój 'POM' plik

<?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> 

Używam Wiosna Boot 1.5.2 i IntelliJ 2017.1

+0

Czy istnieje klasa konfiguracji Spring lub plik tworzący źródło danych? – reos

+0

@reos Nie. Źródło danych znajduje się tylko w pliku 'application.yml'. – g3blv

+0

hmmm to dziwne, czy możesz dodać klasy konfiguracji? – reos

Odpowiedz

7

Spróbuj to pracował dla mnie, jak tego używać @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); 
    } 

a następnie użyć @autowire jak ten

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

Mam nadzieję, że Ty lub ktoś inny :)

pomóc
+0

To działało. Dziękuję za udostępnienie. – g3blv

4

Należy pamiętać, że wiosna Boot autokonfigurowana ziarna nie są obsługiwane jeszcze 100% , zobacz https://youtrack.jetbrains.com/issue/IDEA-139669 dla postępu i możliwych prac.

+0

Próbowałem "Aby włączyć, użyj Pomoc-> Edytuj niestandardowe właściwości, dodaj nową linię z pomysłem.spring.boot.filter.autoconfig = false i zrestartuj IDE", ale nadal mam błąd. Widzę dwa razy ten sam fasolę. Dodałem zrzut ekranu do pierwotnego pytania. Czy istnieje inne obejście tego problemu, czy też powinienem utworzyć Groszek ręcznie i użyć Podstawowego? – g3blv

2

Rozwiązałem przez dodanie kwalifikatora powyżej właściwości:

@Autowired 
@Qualifier("dataSource") 
private DataSource dataSource;