【发布时间】:2020-11-17 16:35:37
【问题描述】:
我正在为我的项目创建两个数据源。一个用于身份验证模块,另一个用于所有其他模块。在编写配置类时,我需要提供要在两个配置类中扫描的包。在身份验证配置类中,我只提供身份验证包,而在通用配置文件中,我需要提供除身份验证之外的所有其他包。所以我需要排除身份验证模块。实际上不可能提供所有包名称来扫描实体,但仅在已开发的大型项目中除外。
这是 AuthDataSourceConfiguration 的配置类
@Configuration
@EnableTransactionManagement
//only need to scan auth repository module here for repository managment
@EnableJpaRepositories(basePackages = "com.test.multipledatasouce.auth.repo", entityManagerFactoryRef = "authEntityManagerFactory", transactionManagerRef = "authTransactionManager")
public class AuthDataSourceConfiguration {
@Autowired
private Environment env;
@Bean
@Primary
@ConfigurationProperties("app.auth.datasource")
public DataSourceProperties authDataSourceProperties() {
return new DataSourceProperties();
}
@Bean
@Primary
@ConfigurationProperties("app.auth.datasource.configuration")
public DataSource authDataSource() {
return authDataSourceProperties().initializeDataSourceBuilder().type(BasicDataSource.class).build();
}
@Primary
@Bean(name = "authEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean authEntityManagerFactory(EntityManagerFactoryBuilder builder) {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(authDataSource());
// only need to scan auth model package here for entity of auth module
em.setPackagesToScan(new String[] { "com.test.multipledatasouce.auth.model" });
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
return em;
}
@Primary
@Bean
public PlatformTransactionManager authTransactionManager(
final @Qualifier("authEntityManagerFactory") LocalContainerEntityManagerFactoryBean authEntityManagerFactory) {
return new JpaTransactionManager(authEntityManagerFactory.getObject());
}
这是我所有其他没有身份验证模块的模块的通用数据源配置文件
@Configuration
@EnableTransactionManagement
//here i am able to exclude auth repo and capture all other modules with help of excludeFilters
@EnableJpaRepositories(basePackages = "com.test.multipledatasouce.*", excludeFilters = {
@ComponentScan.Filter(type = FilterType.REGEX, pattern = "com.test.multipledatasouce.auth.*") }, entityManagerFactoryRef = "commonEntityManagerFactory", transactionManagerRef = "commonTransactionManager")
public class CommonDataSourceConfiguration {
@Autowired
private Environment env;
@Bean
@ConfigurationProperties("app.common.datasource")
public DataSourceProperties commonDataSourceProperties() {
return new DataSourceProperties();
}
@Bean
@ConfigurationProperties("app.common.datasource.configuration")
public DataSource commonDataSource() {
return commonDataSourceProperties().initializeDataSourceBuilder().type(BasicDataSource.class).build();
}
@Bean(name = "commonEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean commonEntityManagerFactory(EntityManagerFactoryBuilder builder) {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(commonDataSource());
> // only need to scan all other module except auth model package here
> // not able to exclude auth module
> em.setPackagesToScan(new String[] { "com.test.multipledatasouce.*" });
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
HashMap<String, Object> properties = new HashMap<>();
em.setJpaPropertyMap(properties);
return em;
}
@Bean
public PlatformTransactionManager commonTransactionManager(
final @Qualifier("commonEntityManagerFactory") LocalContainerEntityManagerFactoryBean commonEntityManagerFactory) {
return new JpaTransactionManager(commonEntityManagerFactory.getObject());
}
【问题讨论】:
标签: java spring-boot jpa package datasource