2017-02-01 5 views
0

다중 소유를위한 tenantIdentifier에 따라 데이터 소스 빈을 만들어야합니다. 나는 새로운 테넌트를 추가하는 것이 context.xml의 구성을 추가하고 응용 프로그램 속성 파일의 테넌트 속성을 추가하는 것만 큼 간단하다는 상자 솔루션을 생각하고 있습니다. 스프링 클라우드 구성에서로드하기 위해 context.xml을 새로 고치기위한 API를 노출합니다. 및 특성 파일.팩토리 빈에 주어진 속성에 따라 빈을 만듭니다.

현재,이 오류에 붙어있어 :

이 문제는 지금 내 공장 빈은 내가 만들려는 빈을 창조하고있다
No qualifying bean of type [javax.sql.DataSource] is defined: expected single matching bean but found 2: dataSourceFactoryBean,defaultDataSource 

하지만, 심지어 기본 콩은 봄에 등록 -문맥. 이것은 위의 문제를 일으키는 것입니다.

이 내 상황에 맞는 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 빈.

답변

1

때로는

+0

당신은 바위 (심지어 한정자와) 여러 중 하나 콩을 해결할 수없는이 봄없이 <bean id="defaultDataSource" 에 재산 primary="true"를 추가하려고! 내 문제를 해결했습니다. 기본자가 있다는 것을 결코 알지 못했습니다. Intellij는 ctrl + space를 사용하여 표시하지 않았습니다. – Pavanraotk