enterbios
enterbios

Reputation: 1755

Spring data with multiple modules not working

I'm trying to set up a project with two data sources, one is MongoDB and the other is Postgres. I have repositories for each data source in different packages and I annotated my main class as follows:

@Import({MongoDBConfiguration.class, PostgresDBConfiguration.class})
@SpringBootApplication(exclude = {
        MongoRepositoriesAutoConfiguration.class,
        JpaRepositoriesAutoConfiguration.class
})
public class TemporaryRunner implements CommandLineRunner {
...
}

MongoDBConfiguration:

@Configuration
@EnableMongoRepositories(basePackages = {
        "com.example.datastore.mongo",
        "com.atlassian.connect.spring"})
public class MongoDBConfiguration {
...
}

PostgresDBConfiguration:

@Configuration
@EnableJpaRepositories(basePackages = {
        "com.example.datastore.postgres"
})
public class PostgresDBConfiguration {
...
}

And even though I specified the base packages as described in documentation, I still get those messages in the console:

13:10:44.238 [main] [] INFO  o.s.d.r.c.RepositoryConfigurationDelegate - Multiple Spring Data modules found, entering strict repository configuration mode!
13:10:44.266 [main] [] INFO  o.s.d.r.c.RepositoryConfigurationExtensionSupport - Spring Data MongoDB - Could not safely identify store assignment for repository candidate interface com.atlassian.connect.spring.AtlassianHostRepository.

I managed to solve this issue for all my repositories by using MongoRepository and JpaRepository but AtlassianHostRepository comes from an external lib and it is a regular CrudRepository (which totally makes sense because the consumer of the lib can decide what type of DB he would like to use). Anyway it looks that basePackages I specified are completely ignored and not used in any way, even though I specified com.atlassian.connect.spring package only in @EnableMongoRepositories Spring Data somehow can't figure out which data module should be used. Am I doing something wrong? Is there any other way I could tell spring data to use mongo for AtlassianHostRepository without changing the AtlassianHostRepository.class itself?

Upvotes: 1

Views: 3826

Answers (1)

enterbios
enterbios

Reputation: 1755

The only working solution I found was to let spring data ignore AtlassianHostRepository (because it couldn't figure out which data source to use) then create a separate configuration for it, and simply create it by hand:

@Configuration
@Import({MongoDBConfiguration.class})
public class AtlassianHostRepositoryConfiguration {

    private final MongoTemplate mongoTemplate;

    @Autowired
    public AtlassianHostRepositoryConfiguration(final MongoTemplate mongoTemplate) {
        this.mongoTemplate = mongoTemplate;
    }

    @Bean
    public AtlassianHostRepository atlassianHostRepository() {
        RepositoryFactorySupport factory = new MongoRepositoryFactory(mongoTemplate);
        return factory.getRepository(AtlassianHostRepository.class);
    }
}

This solution works fine for a small or limited number of repositories used from a library, it would be rather cumbersome to create all the repositories by hand when there are more of them, but after reading the source code of spring-data I see no way to make it work with basePackages as stated in documentation (I may be wrong though).

Upvotes: 1

Related Questions