2017-02-01 3 views
0

Мне нужно создать компонент данных в зависимости от tenantIdentifier для многопользовательской аренды. Я думаю, что из коробки решение, где добавление нового арендатора так же просто, как добавление конфигурации в context.xml и свойства арендатора в файле свойств приложения, выставить API для обновления моего context.xml для загрузки из конфигурации весеннего облака и файл свойств.Создайте компонент в зависимости от свойства, данного фабричному компоненту

В настоящее время я застрял на этой ошибке:

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

Проблема в том, теперь моя фабрике боб создает боб, который я хочу, чтобы это создать, но даже лежащий в основе боб также зарегистрирован весной -context. Это вызывает вышеупомянутую проблему.

Это мой контекст XML:

<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 как это:

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 использовать мою фабрику боб и не фактический факс defaultDataSource.

ответ

1

Попробуйте добавить свойство primary="true" к <bean id="defaultDataSource" Без этой весной иногда не может решить один компонент из нескольких (даже с классификатором)

+0

Вы рок! Решила мою проблему. Никогда не знал, что есть первичный. Intellij не отображал его, используя ctrl + space. – Pavanraotk

Смежные вопросы