2015-10-01 218 views
3

我使用彈簧引導設置了兩個數據源,如http://docs.spring.io/spring-boot/docs/1.3.0.M2/reference/htmlsingle/#howto-two-datasources所示,但是如果這樣做,我的application.properties會顯示警告,例如x.x.username是未知屬性。這在一定程度上是正確的,因爲javax.sql.DataSource不包含網址,用戶名,密碼等,但實現類。我設置了註釋處理器,並且在使用具體類時工作正常。彈簧配置元數據

我注意到org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration$NonEmbeddedConfiguration同時使用DataSourceProperties並且有@ConfigurationPropertiesdataSource()上註釋。這可能會擺脫我的警告,但這是什麼意思。是不是這樣設置屬性兩次?

配置:

@Bean 
@Primary 
@ConfigurationProperties(prefix="datasource.primary") 
public DataSource primaryDataSource() { 
    return DataSourceBuilder.create().build(); 
} 

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

屬性與警告:

datasource.primary.url=jdbc:... 
datasource.primary.username=user 
datasource.primary.password=password 

datasource.secondary.url=jdbc:... 
datasource.secondary.username=user 
datasource.secondary.password=password 
+0

你能爲你的配置添加一些代碼嗎?彈出的警告在哪裏?編譯時間與運行時間?即使出現警告,應用程序是否正常工作? – hotzst

+0

對不起,我想我已經離開了。該警告是STS中的編輯器警告。他們有一個特殊的編輯器用於彈簧啓動屬性文件。我只是在這些屬性上得到了黃色的下劃線,因爲註釋處理器正在生成一個META-INF/spring-configuration-metadata.json文件,它說它應該查看javax.sql.DataSource。我將在上面添加我的配置和一些帶有警告的屬性。這個問題真的涉及Spring Tool Suite,Spring Boot和@ConfigurationProperties。 – DeezCashews

回答

1

因爲有人不屑於+1這個問題,我想我會發布的解決方案。請注意,我認爲DataSource上的@ConfigurationProperties本身是不必要的,因爲它們已經設置在DataSourceProperties上,它用於構建DataSource,但我將它留在那裏,因爲這就是Spring團隊在org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration$NonEmbeddedConfiguration中完成它的方式。我唯一的猜測是爲什麼如果你的DataSource有其他屬性可以設置爲DataSourceProperties以外的其他屬性,但是你會在這些屬性的「Spring Boot application.properties編輯器」中得到警告。

注意DataSourceBuilder將使用Tomcat,HikariCP或下議院DBCP的順序,如果在類路徑中爲DataSource,除非你指定別的東西與dataSourceBuilder.type(Class<? extends DataSource>)

屬性:

datasource.primary.url=jdbc:... 
datasource.primary.username=user 
datasource.primary.password=password 

datasource.secondary.url=jdbc:... 
datasource.secondary.username=user 
datasource.secondary.password=password 

Java的配置:

@Bean 
@Primary 
@ConfigurationProperties(prefix = "datasource.primary") 
public DataSourceProperties primaryProps() { 
    return new DataSourceProperties(); 
} 

@Bean 
@ConfigurationProperties(prefix = "datasource.secondary") 
public DataSourceProperties secondaryProps() { 
    return new DataSourceProperties(); 
} 

@Bean 
@ConfigurationProperties(prefix = "datasource.primary") 
public DataSource secondaryDataSource() { 
    DataSourceProperties props = secondaryProps(); 
    return DataSourceBuilder.create(props.getClassLoader()) 
      .driverClassName(props.getDriverClassName()) 
      .url(props.getUrl()) 
      .username(props.getUsername()) 
      .password(props.getPassword()) 
      .build(); 
} 

@Bean 
@ConfigurationProperties(prefix = "datasource.primary") 
public DataSource secondaryDataSource() { 
    DataSourceProperties props = secondaryProps(); 
    return DataSourceBuilder.create(props.getClassLoader()) 
      .driverClassName(props.getDriverClassName()) 
      .url(props.getUrl()) 
      .username(props.getUsername()) 
      .password(props.getPassword()) 
      .build(); 
}