2017-02-01 13 views
0

マルチテナントのテナント識別子に応じてデータソースBeanを作成する必要があります。私は新しいテナントを追加することは、context.xmlの設定とアプリケーションプロパティファイルのテナントプロパティを追加するだけで簡単ですが、spring.xmlからロードするためにcontext.xmlを更新するためのAPIを公開するという単純な解決策を考えていますおよびプロパティーファイル。ファクトリBeanに与えられたプロパティに応じてBeanを作成します。

現在、私はこのエラーにこだわっている:

No qualifying bean of type [javax.sql.DataSource] is defined: expected single matching bean but found 2: dataSourceFactoryBean,defaultDataSource 

問題は今、私の工場Beanが、私はそれを作成したいBeanを作成しているが、それでも根本的なBeanはまた、春に登録されています-コンテキスト。これは上記の問題を引き起こしています。

これは私のコンテキストxmlです:

public class DataSourceFactoryBean extends AbstractFactoryBean<DataSource> { 

@Autowired 
ApplicationContext applicationContext; 

private String tenantIdentifier; 

public String getTenantIdentifier() { 
    return tenantIdentifier; 
} 

public void setTenantIdentifier(String tenantIdentifier) { 
    this.tenantIdentifier = tenantIdentifier; 
} 

@Override 
public Class<DataSource> getObjectType() { 
    return DataSource.class; 
} 

@Override 
protected DataSource createInstance() throws Exception { 
    DataSource dataSource = (DataSource) applicationContext.getBean(tenantIdentifier); 
    return dataSource; 
} 

私は私のEntityManagerFactoryを伝えるためにとのTransactionManagerは、私の工場の豆を使用していないためにのためにどのような方法があります:

<bean id="dataSourceFactoryBean" class="com.comviva.mfs.txn.util.DataSourceFactoryBean" scope="prototype"> 
    <property name="tenantIdentifier" value="defaultDataSource"/> 
</bean> 

<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/> 

<bean id="defaultDataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close"> 
    <constructor-arg ref="hikariConfig"/> 
</bean> 

<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig"> 
    <property name="poolName" value="txnOracle"/> 
    <property name="registerMbeans" value="false"/> 
    <property name="dataSourceClassName" value="oracle.jdbc.pool.OracleDataSource"/> 
    <property name="maximumPoolSize" value="${mobiquity.database.connection.pool.maximum.pool.size}"/> 
    <property name="minimumIdle" value="${mobiquity.database.connection.pool.minimum.pool.size}"/> 
    <property name="connectionTimeout" value="${mobiquity.database.connection.pool.connection.timeout}"/> 
    <property name="idleTimeout" value="${mobiquity.database.connection.pool.idle.timeout}"/> 
    <property name="maxLifetime" value="${mobiquity.database.connection.pool.max.lifetime}"/> 
    <property name="dataSourceProperties"> 
     <props> 
      <prop key="url">${mobiquity.database.url}</prop> 
      <prop key="user">${mobiquity.database.username}</prop> 
      <prop key="password">${mobiquity.database.password}</prop> 
      <prop key="implicitCachingEnabled">${mobiquity.database.implicitCachingEnabled}</prop> 
      <prop key="maxStatements">${mobiquity.database.maxStatements}</prop> 
     </props> 
    </property> 
    <property name="metricRegistry" ref="platformCommonMetricRegistry"/> 
    <property name="healthCheckRegistry" ref="platformCommonHealthCheckRegistry"/> 
</bean> 

<bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/> 

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="persistenceXmlLocation" value="classpath:META-INF/persistence.xml"/> 
    <property name="persistenceUnitName" value="NewOracle"/> 
    <property name="dataSource" ref="dataSourceFactoryBean"/> 
    <property name="jpaDialect" ref="jpaDialect"/> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
      <property name="databasePlatform" value="org.hibernate.dialect.Oracle10gDialect"/> 
      <property name="showSql" value="${show.sql}"/> 
      <!--<property name="generateDdl" value="true"/>--> 
     </bean> 
    </property> 
</bean> 

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory"/> 
    <property name="dataSource" ref="dataSourceFactoryBean"/> 
    <property name="defaultTimeout" value="${default.timeout}"/> 
</bean> 

<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/> 

マイDataSourceFactoryBeanはこのようなものです実際のdefaultDataSource Beanです。

答えて

1

は時々

+0

あなたは岩(でも修飾子を使用して)複数のBeanを解決することはできません。この春なし<bean id="defaultDataSource" にプロパティprimary="true"を追加してみてください!私の問題を解決しました。プライマリがあることは決して知らなかった。 Intellijはctrl + spaceを使ってそれを表示しませんでした。 – Pavanraotk

関連する問題